首页 > 解决方案 > 如果第一个字符是“+”或“-”,如何按字母顺序对 TreeMap 进行排序

问题描述

我的地图看起来像这样

键: + something 值: something

所以它有大量以+or开头的字符串-,我需要按字母顺序对其进行排序。

例如:

{
  host: hexlet.io,
+ timeout: 20,
+ verbose: true,
- follow: false,
- proxy: 123.234.53.22,
- timeout: 50
}

它必须排序为:

{
- follow: false,
  host: hexlet.io,
- proxy: 123.234.53.22,
- timeout: 50,
+ timeout: 20,
+ verbose: true
}

如何跳过“+”或“-”对其进行排序?

升级版:

太感谢了!但我错过了我的样板必须是这样的:(它在减号之前包含 2 个空格,在它之后包含 1 个空格)

{
  - follow: false
    host: hexlet.io
  - proxy: 123.234.53.22
  - timeout: 50
  + timeout: 20
  + verbose: true
}

因此,如果我使 s -> s.substring(2) 它不按字母顺序排序,或者如果我使用 3-4,我的“超时”字符串崩溃,我有“+超时:50”而不是“-超时: 50”和“+超时:20”。我该如何解决?

标签: javatreemapsortedmap

解决方案


TreeMap我们可以使用自定义创建一个Comparator,然后使用putAll将现有地图中的所有元素添加到已排序的实现中。

根据示例,自定义比较器需要包括两部分:

  1. 检查键是否以开头" + "并将其放在末尾,假设以空前缀开头" - "或以空前缀开头的字符串" "应被视为相同
  2. 在需要时比较密钥的“子字符串”版本,而不需要前缀。

例如:

Map<String, Object> data = Map.of(
    "    host", "hexlet.io",
    "  + timeout", 20,
    "  + verbose", true,
    "  - follow", false,
    "  - proxy", "123.234.53.22",
    "  - timeout", 50
);
String plusPrefix = "  + ";

Map<String, Object> sorted = new TreeMap<>(
  Comparator.comparing((String str) -> str.startsWith(plusPrefix) ? 1 : -1)
            .thenComparing(str -> str.substring(plusPrefix.length()))
);
sorted.putAll(data);
System.out.println("{");
sorted.forEach((k, v) -> System.out.println(k + ": " + v));
System.out.println("}");

输出(按要求的顺序排序):

{
  - follow: false
    host: hexlet.io
  - proxy: 123.234.53.22
  - timeout: 50
  + timeout: 20
  + verbose: true
}

推荐阅读