比较器<string>返回适当的值,但ArrayList未排序

时间:2016-10-28 00:52:48

标签: java sorting arraylist

我尝试使用在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保持不变。发生了什么事?

2 个答案:

答案 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);