0

重複の可能性:
1 つの列に基づいて 2 次元配列を並べ替える

私はデータを持っています:

"Something1" "TRUE"
"Something2" "FALSE"
"Something3" "FALSE"
"Something4" "TRUE"

次に、多次元配列に格納します。

String[][] myData = new String[data.length][2];

ここで、この配列をソートして、最初に「TRUE」で並べ替えると、次のようになります。

"Something1" "TRUE"
"Something4" "TRUE"
"Something2" "FALSE"
"Something3" "FALSE"

私は Arrays.sort(); を見ています。しかし、これを実装する方法や、これが最善の方法であるかどうかはわかりません。

4

3 に答える 3

2

カスタム コンパレータを使用して配列を並べ替えます。

Arrays.sort(myData , new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                return ((String) o2[1]).compareTo(o1[1]);
            }
        });
于 2012-12-18T12:39:00.937 に答える
0

はい、どうぞ。テスト メイン クラスから実行できる 2 つの自己完結型のサンプル ソリューション。多次元配列を使用する最初のもの。

    Object values[][] = new Object[][] {
            { "a", Boolean.FALSE }, 
            { "b", Boolean.TRUE }, 
            { "c", Boolean.TRUE },              
    };

    Arrays.sort(values, 
            new Comparator<Object[]>() {
                @Override
                public int compare(Object[] tuple1, Object[] tuple2) {
                    int result = -1*((Boolean) tuple1[1]).compareTo((Boolean) tuple2[1]);
                    if (result == 0) {
                        result = ((String) tuple1[0]).compareTo(((String) tuple2[0]));
                    }                       
                    return result;
                }
            }
    );

    for (Object[] tuple : values) {
        System.out.println(Arrays.toString(tuple));
    }

2 つ目は、ジェネリック (かつタイプ セーフな) タプルを使用します。

    class Tuple<A, B> {
        private final A first;
        private final B second;

        public Tuple(A first, B second) {
            this.first = first;
            this.second = second;
        }

        public A getFirst() {
            return this.first;
        }

        public B getSecond() {
            return this.second;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String toString() {
            return "[first=" + first.toString() + ",second="  + second.toString() + "]";
        }
    };

    Tuple<String, Boolean> values[] = new Tuple[] {
            new Tuple<String, Boolean>("a", Boolean.FALSE), 
            new Tuple<String, Boolean>("b", Boolean.TRUE),
            new Tuple<String, Boolean>("c", Boolean.TRUE),              
    };

    Arrays.sort(values, 
            new Comparator<Tuple<String, Boolean>>() {
                @Override
                public int compare(Tuple<String, Boolean> tuple1, Tuple<String, Boolean> tuple2) {
                    int result = -1*tuple1.getSecond().compareTo(tuple2.getSecond());
                    if (result == 0) {
                        result = tuple1.getFirst().compareTo(tuple2.getFirst());
                    }                       
                    return result;
                }
            }
    );

    for (Tuple<String, Boolean> tuple : values) {
        System.out.println(tuple);
    }
于 2012-12-18T15:27:15.083 に答える
0

配列を使用する必要がある場合は、Arrays.sort()をカスタム コンパレータと共に使用します。String[]そのコンパレーターは、渡されたの適切な要素でソートします。

おそらく多次元配列を使用するのではなく、配列の各行にオブジェクトを実装します。そのデータは、配列内の単なる要素ではなく、密接に結びついているように見えます。適切に入力できます-現時点では、ブール値を文字列として保存しています。

于 2012-12-18T12:40:04.250 に答える