【问题标题】:How to sort TreeMap alphabetically if first char is "+" or "-"如果第一个字符是“+”或“-”,如何按字母顺序对 TreeMap 进行排序
【发布时间】:2021-07-30 19:22:43
【问题描述】:

我的地图是这样的

键: + 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”而不是“ -超时:50”和“+超时:20”。 我该如何解决?

【问题讨论】:

  • 您应该使用自定义比较器。请不要使用图片 - 格式化代码
  • Comparator.comparing(s -> s.substring(2))
  • 非常感谢!并抱歉图片不正确!
  • 在此处复制并粘贴 3 个内容 作为文本(这样我们就可以复制并尝试在我们这边:(1)未排序的字符串,(2)按您想要的方式排序的字符串, (3) 你的 Java 尝试为 minimal reproducible example
  • 对这类问题的通常最佳答案是不要使用一些下游文本表示,使用本机数据结构。在这种情况下,这看起来像是某种差异。

标签: java treemap sortedmap


【解决方案1】:

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

【讨论】:

  • 你能检查一下UPD吗?
  • 就目前而言,当"- host", "obj" 是 K/V 对时,这将失败。它认为host 是重复键并覆盖现有的。
  • @k0dama1337,我提供了更好地处理前缀的更新,我还假设host 也有一个 4 个空格的“空”前缀,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多