2011-06-29 33 views
0
import java.util.*; 

public class ABC { 
    public static void main(String[] args) { 
     List<Integer> values = null; 

     values = new ArrayList<Integer>(); 
     values.add(5); 
     values.add(9); 
     values.add(3); 
     values.add(55); 
     values.add(4); 

     Collections.sort(values); 
     System.out.println(values); 



     values = new ArrayList<Integer>(); 
     values.add(5); 
     values.add(9); 
     values.add(3); 
     values.add(55); 
     values.add(4); 

     Comparator<Integer> cmp = new Comparator<Integer>() { 
        @Override 
        public int compare(Integer o1, Integer o2) { 
         int o1i = o1; 
         int o2i = o2; 
         return o1i - o1i; 
        } 
       }; 

     Collections.sort(values, cmp); 
     System.out.println(values); 
    } 
} 

此打印:Collections.sort不適用於自定義比較器?

[3, 4, 5, 9, 55] 
[5, 9, 3, 55, 4] 

這顯然不是預期的結果。我錯過了什麼?

+1

你'compare'方法總是返回0 –

回答

7

你有一個錯誤:

變化

return o1i - o1i; 

return o1i - o2i; 
+0

你有良好的眼睛。 – Neil

+0

謝謝。並認爲我在提交之前已經閱讀了3次:) –

+1

這是那些只有在你知道自己在做什麼時纔會使用的非常「聰明的編程技巧」之一 - 對於沒有無符號類型的語言,很好的整數你仍然可以施展長期,這將工作)。除了Integer.MAX_VALUE Voo

0
return o1i - o1i; 

我猜你的意思;

return o1i - o2i; 
2

您的比較器正在減去o1i - o1i,每次給出0。

(你不是被分配o1o2當地int變量或是得到什麼,只是減去o1 - o2。)

+0

這主要是爲了允許在有問題的行處放置斷點。 –

1

你有一個打字錯誤,comperator應該有return o1i - o2i;

,而不是return o1i - o1i;

0

使用這一個

int o1i = o1; 
        int o2i = o2; 
        return o1i - o2i; 

這給出了以下結果

[3, 4, 5, 9, 55] 

[3,4,5,9,55]