我尝试使用在Collections.sort()方法中调用的自定义Comparator对字符串的ArrayList进行排序。 代码是
public static String largestNumber(final List<Integer> a) {
ArrayList<String> list = new ArrayList<String>();
for(int i=0; i<a.size(); i++) {
list.add(String.valueOf(a.get(i)));
}
Comparator<String> c = new Comparator<String>() {
public int compare(String s1, String s2) {
System.out.println("comparing: "+(s1+s2)+
" and "+(s2+s1));
System.out.println((s1+s2).compareTo(s2+s1));
return (s1+s2).compareTo(s2+s1);
}
};
for(int i=0; i<a.size(); i++) {
Collections.sort(list, c);
System.out.println("sorted:");
for(int j=0; j<a.size(); j++) {
System.out.print(list.get(j));
}
System.out.println();
}
StringBuffer sb = new StringBuffer();
for(int i=0; i<list.size(); i++) {
sb.append(list.get(i));
}
return sb.toString();
}
比较器返回适当的值。例如,当它比较字符串&#34; 303&#34;和&#34; 330&#34;,它返回一个负值。但是,ArrayList保持不变。发生了什么事?
答案 0 :(得分:0)
如果要比较数字,只需将它们解析为Integer
然后减去它们。 Collection
将完成剩下的工作。
比较器接口只是一个合同,说明要比较的两个元素,如果A的值小于B(AB)的值,则A为第一。如果A的值等于B的值(A == B),那么Collection
实现可能会将它们任意放在一起。
您只需要执行以下操作:
Comparator<String> c = new Comparator<String>() {
public int compare(String s1, String s2) {
System.out.println("comparing: "+ s1 +
" and " +s2);
//Avoid the below check, it creates an infinite recursion.
//System.out.println(s1.compareTo(s2));
//Since you Strings are number, it's ok to do this.
int a = Integer.parseInt( s1 ); //Auto-unboxing;
int b = Integer.parseInt( s2 ); //Auto-unboxing;
return a-b;
}
};
另外,避免递归比较,它会产生无限递归,导致StackOverFlowException
异常。
我希望我有所帮助。
祝你有个愉快的一天。 :)
答案 1 :(得分:-1)
找出问题所在。我需要返回(s2 + s1).compareTo(s1 + s2);