对列表中的不同类型字符串进行排序
Sorting different type Strings in List
我有一个包含 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 块,但我同时有 java.lang.IllegalArgumentException: Comparison method violates its general contract!
,我不知道为什么。一直在尝试解决异常,算法可以做我想做的事。任何帮助表示赞赏。谢谢。
任何比较器都必须遵循以下规则:
- 如果
A<B
(例如,a.compareTo(b)
return 是一个负数),则 B>A
必须为真(例如,如果您要调用 b.compareTo(a)
,它必须 return一个正数)。
A=A
(a.compareTo(a)
必须 return 0)。
- 如果
A<B
和 B<C
那么这必须成立:A<C
.
该错误表示您没有这样做。
您好像在声明所有 AA 类别都在所有 BB 类别之前(通过 ( o1.contains( "AA" ) && o2.contains( "BB" ) )
行,但您没有添加相反的内容,即所有 BB 都在所有 AA 之后。您必须写成对使用,否则将无法正常工作。解决这个问题。也许还有更多违规行为,但是,一次一个步骤。
这里是一个示例,用于解决给定 string
列表的排序问题,其格式为前两个字符代表字符串,其余字符构成整数。
public static void main (String[] args)
{
List<String>list = Arrays.asList("AA0", "AA5", "BB9", "BB2", "AA1", "BB13", "AA7", "AA2");
Collections.sort(list,new Comparator<String>(){
@Override
public int compare(String o1,String o2) {
String substr1 = o1.substring(0,2);
String substr2 = o2.substring(0,2);
Integer num1 = Integer.parseInt(o1.substring(2));
Integer num2 = Integer.parseInt(o2.substring(2));
int strCompare = substr1.compareTo(substr2);
int intCompare = num1.compareTo(num2);
if (strCompare == 0) return (intCompare == 0 ? strCompare : intCompare);
else return strCompare;
}
});
for (int i = 0; i < list.size(); ++i) {
System.out.println(list.get(i));
}
}
我有一个包含 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 块,但我同时有 java.lang.IllegalArgumentException: Comparison method violates its general contract!
,我不知道为什么。一直在尝试解决异常,算法可以做我想做的事。任何帮助表示赞赏。谢谢。
任何比较器都必须遵循以下规则:
- 如果
A<B
(例如,a.compareTo(b)
return 是一个负数),则B>A
必须为真(例如,如果您要调用b.compareTo(a)
,它必须 return一个正数)。 A=A
(a.compareTo(a)
必须 return 0)。- 如果
A<B
和B<C
那么这必须成立:A<C
.
该错误表示您没有这样做。
您好像在声明所有 AA 类别都在所有 BB 类别之前(通过 ( o1.contains( "AA" ) && o2.contains( "BB" ) )
行,但您没有添加相反的内容,即所有 BB 都在所有 AA 之后。您必须写成对使用,否则将无法正常工作。解决这个问题。也许还有更多违规行为,但是,一次一个步骤。
这里是一个示例,用于解决给定 string
列表的排序问题,其格式为前两个字符代表字符串,其余字符构成整数。
public static void main (String[] args)
{
List<String>list = Arrays.asList("AA0", "AA5", "BB9", "BB2", "AA1", "BB13", "AA7", "AA2");
Collections.sort(list,new Comparator<String>(){
@Override
public int compare(String o1,String o2) {
String substr1 = o1.substring(0,2);
String substr2 = o2.substring(0,2);
Integer num1 = Integer.parseInt(o1.substring(2));
Integer num2 = Integer.parseInt(o2.substring(2));
int strCompare = substr1.compareTo(substr2);
int intCompare = num1.compareTo(num2);
if (strCompare == 0) return (intCompare == 0 ? strCompare : intCompare);
else return strCompare;
}
});
for (int i = 0; i < list.size(); ++i) {
System.out.println(list.get(i));
}
}