【问题标题】:Sort collection with multiple criteria [closed]使用多个条件对集合进行排序[关闭]
【发布时间】:2021-06-25 10:54:47
【问题描述】:

假设我有一个列表 ["d", "a", "y / a", "a / z", "b / a / c", "a / c / a"] 我需要用下一种方式对其进行排序:

  1. 应按斜线数排序
  2. 之后应该按字母排序 结果: [“a”“d”“a / z”“y / a”、“a / c / a”,“b / a / c”]

第一部分正在处理这个:

Comparator<String> comparator = Comparator.comparing(s -> StringUtils.countMatches(s, "/"));
map.keySet().stream().sorted(comparator).forEach(System.out::println);

结果: [“d”“a”“y / a”“a / z”、“b / a / c”,“a / c / a”]

【问题讨论】:

  • StringUtils.countMatches(s, "//") 应该是StringUtils.countMatches(s, "/")
  • 是的,为什么要使用 2 个斜杠?
  • 这能回答你的问题吗? How to sort an ArrayList using two sorts
  • comparing( 可能是comparingInt(
  • StringUtils.countMatches(s, "/") 可能是s.split("/").length

标签: java sorting collections


【解决方案1】:

那是因为您忽略了“之后应该按字母排序”部分。这很容易解决,因为Comparators 是可组合的。只需添加.thenComparing(Comparator.naturalOrder()),当谈到Strings 时,这将通过以默认(自然)方式(即按字母顺序)对等价元素(根据/ 计数)进行排序来解决不正确的排序问题:

Comparator<String> comparator = Comparator.comparing(
        s -> StringUtils.countMatches(s, "//")
).thenComparing(
        Comparator.naturalOrder()
));

此外,您可能指的是"/",而不是"//"

【讨论】:

  • 我不知道StringUtils,但countMatches 不会返回int
  • 它不工作 Comparator 比较器 = Comparator.comparingInt(s -> StringUtils.countMatches(s, "/")).thenComparing(Comparator.naturalOrder()); 尝试将其放入代码中
  • @java-dev-ua 什么不适合你?我无法直接访问StringUtils,但this code 的输出与您的完全相同相同。也许你忘记了最后一个)?或者您(可能)忘记将comparingInt 更改为comparing
  • ideone 上的工作示例(只需将类型添加到 s 以避免强制转换或第二次分配)
  • @user15244370 它是 JS,而不是 Java。检查我的解决方案。有点不一样。
【解决方案2】:

正确的解决办法是:

Collections.sort(listStrings, ((Comparator<String>)(o1, o2) -> {
            int i = o1.split("/").length - o2.split("/").length;
            if (i == 0) return o1.compareTo(o2);
            return i;
        }).thenComparing(String::compareTo));

Collections.sort(list, Comparator.comparingInt((String o) -> StringUtils.countMatches(o, "/"))
        .thenComparing(String::compareTo)
);

【讨论】:

  • “正确”?第一个解决方案不是那么多(恕我直言)。 1) 我以为你想让它按/ 的计数排序 - 但那是忽略文本末尾的斜杠(例如" a / b ////" 将在"a / b / c" 之前排序)它缺少split 2 的第二个参数) 为什么thenComparing?它已经在第一个比较器(3)中执行comperaTo,它正在更改原始列表,流解决方案不会更改原始列表)
猜你喜欢
  • 2015-05-08
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多