如果第一个字符是“+”或“-”,如何按字母顺序对 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"。
我该如何解决?
我们可以创建一个带有自定义 Comparator
的 TreeMap
,然后使用 putAll
将现有映射中的所有元素添加到已排序的实现中。
根据例子,自定义比较器需要包含两部分:
- 检查键是否以
" + "
开头并放在最后,假设以" - "
开头或空前缀" "
的字符串应该被相同对待
- 在需要时比较密钥的“子字符串”版本,不带前缀。
例如:
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
}
我有这样的地图
键: + 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"。 我该如何解决?
我们可以创建一个带有自定义 Comparator
的 TreeMap
,然后使用 putAll
将现有映射中的所有元素添加到已排序的实现中。
根据例子,自定义比较器需要包含两部分:
- 检查键是否以
" + "
开头并放在最后,假设以" - "
开头或空前缀" "
的字符串应该被相同对待 - 在需要时比较密钥的“子字符串”版本,不带前缀。
例如:
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
}