1

5 枚のカードの値を保持する 2 次元配列があります。5 つの配列のそれぞれの最初の要素はカードのスーツを表し、2 番目の要素はカードの値を表します。

2 番目の要素の並べ替え順序を維持しながら、2 番目の要素で 2 次元配列を並べ替え、次に最初の要素で並べ替えたい (それが理にかなっている場合)。たとえば、1 のすべてのスーツは、2 のすべてのスーツよりもソートされたリストの下位になります。たとえば、{{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}} を出力しています。誰か提案はありますか?

4

4 に答える 4

1

解決策 1: 2 番目の要素で配列を並べ替えてから、最初の要素で配列を並べ替えます。は安定しているためArrays.sort、最初の要素で最初に比較し、次に 2 番目の要素で比較することと同じです。

解決策 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();
  }
于 2012-04-25T17:59:41.480 に答える
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]));
于 2012-04-25T17:59:35.287 に答える