java - 如果第一个字符是“+”或“-”,如何按字母顺序对 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”。我该如何解决?
解决方案
TreeMap
我们可以使用自定义创建一个Comparator
,然后使用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
}
推荐阅读
- c++ - 如何在C++中使用future和promise从函数线程获取返回值
- json - 如何在 Django 中的 JSONField 上运行引用特定元素的 FOR 循环
- c# - Ajax get 调用不会传递参数
- python - 如何在一个表达式中合并两个复杂的字典?
- azure - Azure 警报可以发送到事件中心
- linux - 自动化远程交互提示
- matlab - 通过 Matlab 中的移动索引移动矩阵中的批量行
- swift - 如何解决:“keyWindow”在 iOS 13.0 中已弃用
- angular - 一种用于开发和生产的图像路径,Angular 构建
- php - PHP 不会处理多个文件 (Chrome)