如果第一个字符是“+”或“-”,如何按字母顺序对 TreeMap 进行排序

How to sort TreeMap alphabetically if first char is "+" or "-"

我有这样的地图

键: + something 值: something

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

例如:

{
  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 " 而不是 "-timeout: 50" 和 "+ timeout: 20"。 我该如何解决?

我们可以创建一个带有自定义 ComparatorTreeMap,然后使用 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
}