java - 对列表中的不同类型字符串进行排序

标签 java string sorting java-stream string-comparison

我有一个包含 AA0 AA5 BB2 BB9 AA1 BB13 AA7 AA2 的字符串列表,顺序不对。我想要的是两个单独的类别,如 AA0 AA1 AA2 AA5 AA7 BB2 BB9 BB13 我该怎么做?

我已经尝试过 myList.stream().sorted(mySorter).foreach(...); 其中 mySorter 如下所示:

  private final Comparator<String> mySorter= ( o1, o2 ) -> {
  try
  {
     final int first = Integer.parseInt( o1.substring( 2, o1.length() ) );
     final int second = Integer.parseInt( o2.substring( 2, o2.length() ) );
     System.out.println( o1 + " -> " + first + " " + o2 + " -> " + second );
     if ( o1.contains( "AA" ) && o2.contains( "BB" ) )
     {
        return -1;
     }
     else if ( o1.contains( "AA" ) && o2.contains( "AA" ) )
     {
        return first - second;

     }
     else if ( o1.contains( "BB" ) && o2.contains( "BB" ) )
     {
        return first - second;
     }
     return first - second;

  }
  catch ( final Exception e )
  {
     e.printStackTrace();
     return 0;
  }
  };

我知道它确实包含不必要的 if/else block ,但我有 java.lang.IllegalArgumentException: Comparison method violates its general contract! 同时我不知道为什么。一直在尝试解决异常,算法可以做我想做的事。任何帮助表示赞赏。谢谢。

最佳答案

任何比较器都必须遵循以下规则:

  1. 如果A<B (如 a.compareTo(b) 返回负数),然后 B>A必须为真(例如,如果您要调用 b.compareTo(a),它必须返回一个正数)。
  2. A=A (a.compareTo(a) 必须 返回 0)。
  3. 如果A<BB<C那么这必须持有:A<C .

该错误意味着您没有这样做。

您似乎在声明所有 AA 类别都在所有 BB 类别之前(通过行 ( o1.contains( "AA" ) && o2.contains( "BB" ) ) ,但您没有添加相反的内容,即所有 BB 都在所有 AA 之后。您必须成对或成对地写它不会工作。修复它。也许有更多的违规行为,但是,一次一个步骤。

关于java - 对列表中的不同类型字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536529/

相关文章:

c - 为什么这段代码没有指定访问数组的哪个元素?

c++ - 为什么显示垃圾值?

Java Hadoop MapReduce 多值

java - 最大素因子-欧拉工程

java - Java 中 String 的 StringBuilder

linux - 带/不带引号和单引号/双引号的 bash 字符串

java - HTTP 状态 500 - javax.el.PropertyNotFoundException : Property 'first_name' not found on type java. lang.String

java - 根据项目的输出文件夹结构配置 Tomcat webapps 目录

java - 按特定列值对 2D 数组行进行冒泡排序

c++ - 无法将合并排序设为 O(n log n)