我有一个包含 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!
同时我不知道为什么。一直在尝试解决异常,算法可以做我想做的事。任何帮助表示赞赏。谢谢。
最佳答案
任何比较器都必须遵循以下规则:
- 如果
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 之后。您必须成对或成对地写它不会工作。修复它。也许有更多的违规行为,但是,一次一个步骤。
关于java - 对列表中的不同类型字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536529/