2012-04-25 124 views
1

我有一個保存5張卡片的值的二維數組。 5個陣列中每個陣列的第一個元素代表卡的花色,第二個元素代表卡的值。需要幫助按二元素排序二維數組,然後按第一個元素排序(Java)

我想排序第二個元素的二維數組,然後通過第一個元素,同時保持第二個元素的排序順序(如果這是有道理的)。例如,所有的西裝套裝在排序列表上都會比兩套套裝中的低。例如,{{0,1},{2,1},{0,2}}應該變爲{{0,1},{2,1},{0,2}}。

以下是我有:

// {{3,2}, {2,2}, {0,1}, {1,0}, {2,3}} should become 
// {{1,0}, {0,1}, {2,2}, {3,2}, {2,3}} 

int[][] hand = {{3,2},{2,2},{0,1},{1,0},{2,3}}; 
sort(hand); 

public static void sort(int[][] hand){ 
    Arrays.sort(hand, new Comparator<int[]>(){ 
     public int compare(int[] o1, int[] o2){ 
      return Integer.valueOf(o1[1]).compareTo(Integer.valueOf(o2[1])); 
     } 
    }); 
} 

這是輸出{{1,0},{0,1},{3,2},{2,2},{2,3} }。有沒有人有什麼建議?

+0

你比較沒有按」根本不考慮第一個元素的值。它需要,當第二個要素相等時。 – 2012-04-25 18:00:31

回答

1

解決方案1:通過第二個元素的數組進行排序,然後由第一個元素的數組進行排序。由於Arrays.sort是穩定的,這相當於首先比較第一個元素,然後是第二個元素。

解決方案2:修改你的比較如下:

Arrays.sort(hand, new Comparator<int[]>() { 
    public int compare(int[] o1, int[] o2) { 
    if (o1[0] == o2[0]) { 
     return Integer.compare(o1[1], o2[1]); 
    } else { 
     return Integer.compare(o1[0], o2[0]); 
    } 
    } 
}); 

,或者用番石榴(披露:我番石榴貢獻),你可以只寫比較器作爲

public int compare(int[] o1, int[] o2) { 
    return ComparisonChain.start() 
     .compare(o1[0], o2[0]) 
     .compare(o1[1], o2[1]) 
     .result(); 
    } 
0

這會爲你工作:

int compare1 = Integer.valueOf(o1[1]).compareTo(Integer.valueOf(o2[1]); 
if(compare1 != 0) 
    return compare1; 
else 
    return Integer.valueOf(o1[0]).compareTo(Integer.valueOf(o2[0])); 
相關問題