【问题标题】:Sorting in java reverseOrderjava中的reverseOrder排序
【发布时间】:2019-06-28 19:30:54
【问题描述】:

我有:

String[] subdivisions = {"K1","K1\\SK1","K2","K2\\SK1\\SSK1"};

我排序了:

Arrays.stream(subdivisions).sorted(Comparator.reverseOrder()).forEach(System.out::println);

我明白了:

K2\SK1\SSK1
K2
K1\SK1
K1

但我需要这样排序:

K2
K2\SK1\SSK1
K1
K1\SK1

如何更改排序条件? 如何正确编写排序?

【问题讨论】:

  • 通过编写自己的比较器,将“A\B”放在“A”之后?
  • 如果元素不按这个顺序怎么办?你总是期望得到这样的结果吗?
  • @YCF_L 这是一个排序,原始顺序无关紧要。 reverseOrder() 不是逆向操作,是自然降序排序。
  • @YCF_L 是的。我需要先去长度小于下一个元素的地方。并以相反的顺序
  • @YCF_L 我明白了,只是举个例子。

标签: java string sorting


【解决方案1】:

这是一个自定义Comparator 方法的示例,用于按您想要的方式进行排序:

public class Test {
    public static void main(String[] args) {
        String[] subdivisions = {"K1","K1\\SK1","K2","K2\\SK1\\SSK1"};

        Arrays.stream(subdivisions).sorted(Test::compare).forEach(System.out::println);
    }
    private static int compare(String a, String b) {
        if (a.length() < b.length() && b.startsWith(a))
            return -1; // a is prefix of b, so sort a first
        if (b.length() < a.length() && a.startsWith(b))
            return 1; // b is prefix of a, so sort b first
        return b.compareTo(a); // descending
    }
}

输出

K2
K2\SK1\SSK1
K1
K1\SK1

【讨论】:

    【解决方案2】:

    ...这是所需排序的 lambda 表达式:

    Arrays.stream( subdivisions ).sorted(
        (new Comparator<String>() {
          @Override
          public int compare( String s1, String s2 ) {
            int len = Math.min( s1.length(), s2.length() );
            return( s2.substring( 0, len ).compareTo( s1.substring( 0, len ) ) );
          } }).thenComparing( String::length ) ).forEach( System.out::println );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 2012-04-23
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2012-11-23
      相关资源
      最近更新 更多