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!在同一时间我不知道为什么.一直试图解决异常,算法可以做我想要的.任何帮助赞赏.谢谢.
任何比较器必须遵循以下规则:
A<B(如,a.compareTo(b)返回一个负数),则B>A必须为真(如果你打电话b.compareTo(a),它必须返回一个正数).A=A(a.compareTo(a) 必须返回0).A<B和B<C那么这必须持有:A<C.这个错误意味着你没有这样做.
看起来你说所有AA类别都在所有BB类别之前(通过线路( o1.contains( "AA" ) && o2.contains( "BB" ) ),但你没有添加反向,其中所有BB都在所有AA之后.你必须成对写入它或者它不起作用.解决这个问题.也许有更多的违规行为,但是,一步一步.