2016-03-04 43 views
-3

我試圖實現整數數組的自定義排序。邏輯是:通過距離查找中位數和順序。問題是我試圖使用比較器進行排序,並想知道爲什麼使用List的變體不起作用,而同樣的Arrays.sort爲我工作。Collections.sort(列表<T> t,比較器<T> c)不工作

請在下面的代碼找到下面的代碼,用於List變體的代碼。

public static Integer[] sort(Integer[] array) { 
    //implement logic here 
    if (array == null) return null; 
    final Integer[] tempArray = Arrays.copyOf(array, array.length); 
    Arrays.sort(tempArray); 
    final int median = tempArray.length%2==1 ? tempArray[tempArray.length/2] : (tempArray[tempArray.length/2]+tempArray[tempArray.length/2 - 1])/2; 



    //final List<Integer> t = new ArrayList(Arrays.asList(array)); 
    final Integer[] t = tempArray; 
    //Collections.sort(t, new Comparator<Integer>() 
    Arrays.sort(t, new Comparator<Integer>() 
    { 
     @Override 
     public int compare(Integer i1, Integer i2) 
     { 
      Integer one = Math.abs(i1 - median); 
      Integer two = Math.abs(i2 - median); 
      Integer var1 = one - two; 
      Integer var2 = two - one; 
      System.out.println(String.format("Compare:\r\nmedian: %d\r\narg1: %d , arg2: %d\r\n"+ 
        "distance1: %d, distance2: %d\r\nif dist1 > dist2 then compare: %d, else %d", median, i1, i2,one,two, var2,var1)); 
      System.out.println(String.format("\r\nresult: %d %s %d",i1, (one > two?"<":one < two?">":i1.compareTo(i2)>0?">":"<"), i2)); 
      System.out.println("\r\n\r\nNow array is: "+Arrays.asList(t)); 
      System.out.println("-------------------------------"); 

      if (one == two) { 
       return i1.compareTo(i2); 
      } else 
       return one.compareTo(two); 
     } 
    }); 

    //tempArray = (Integer[]) t.toArray(new Integer[t.size()]); 

    return t; 
}`` 
+0

你有什麼輸出?你想要什麼輸出? – Tunaki

+0

由於'tempArray'是'array'的一個副本,而不是一個引用,並且該列表是從'array'而不是'tempArray'創建的,所以你正在對'tempArray'進行兩次排序,但是隻對列表進行一次排序。這可能不是你的實際問題,但它是一個區別,因爲數組「t」已經預先排序,而列表不會。 – Thomas

+0

@Tunaki輸入:{1,10,6,2,3,1,1}我期望輸出:[2,1,1,1,3,6,10],但如果我使用List,{1, 10,6,2,3,1,1}比較方法的每次迭代仍然相同 –

回答

3

的整數的比較是錯誤的...

if (one == two) { 

必須

if (one.intValue() == two.intValue()) { 

如果不是,你是比較引用,而不是整數的值替換.. 。

+0

或者只是'one.equals(two)'。 –

+0

謝謝...我會包括它 –

+0

感謝您的更正。但是這個代碼仍然適用於Array.sort並生成正確的順序。那麼,爲什麼它不適用於List ... –

相關問題