在列表中排序不同类型的字符串

Pic*_*ure 3 java sorting string string-comparison java-stream

我有一个包含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;
  }
  };
Run Code Online (Sandbox Code Playgroud)

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

rzw*_*oot 7

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

  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之后.你必须成对写入它或者它不起作用.解决这个问题.也许有更多的违规行为,但是,一步一步.