0

2D int 配列があります。たとえば、重複した行を削除したい

30,40,50

50,30,40

30,40,50

上記の例では、2 行目と 3 行目が 1 行目の複製です。

ArrayListこの概念に役立つクラスである動的に成長および沈降できることはわかっていますが、どのようint[][]ArrayList.

4

5 に答える 5

2

まず、オーバーライドするデータを保持し 、データの同等性を示すpublic boolean equals(Object obj)クラスを作成する必要があります。public int hashCode()

public class Row {

    private int[] ints;

    public Row(int[] ints) {
        this.ints = ints.clone();
        Arrays.sort(this.ints);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(ints);
    }

    @Override
    public boolean equals(Object obj) {

        if(obj instanceof Row) {
            Row another = (Row) obj;
            int[] original = Arrays.copyOf(another.ints, another.ints.length);
            return Arrays.equals(ints, original);
        } else {
            return false;
        }
    }

    @Override
    public String toString() {
        return Arrays.toString(ints);
    }

}

テストケース

public class Test {

    public static void main(String[] args) {
        int[][] arrays = new int[][]{{30,40,50}, {50,30,40}, {30,40,50}, {10, 20, 30}};
        Set<Row> rows = new HashSet<Row>();
        for(int[] a: arrays) {
            rows.add(new Row(a));
        }
        for(Row row: rows) {
            System.out.println(row);
        }
    }
}

出力

[10, 20, 30]
[30, 40, 50]
于 2012-05-28T11:33:58.153 に答える
2

すべての一意の番号がすぐに必要な場合は、Set<Integer>直接使用できます

30,40,50 50,30,40
30,40,50

上記の例では、2 番目と 3 番目の行は 1 番目の行の複製です

3行すべてが同じである場合は、直接使用できますSet<Integer>

于 2012-05-28T11:07:43.003 に答える
0

Functional Javaの永続コレクションを使用する場合、解決策は非常に単純です。

(注: List以下でSet言及しているのは、標準ライブラリからではなく、Functional Java からのものです。)


xsstypeという名前の変数にデータを格納しているとしますList<List<Integer>>

やりたいことは、次のように説明できます。

xss同じ要素を含む 2 つの行が等しいと見なされるという基準で重複排除します。

  • Listnub重複排除の方法を提供します。
  • List2 つの s に同じ要素が含まれているかどうかは、それらをSets に変換して等しいかどうかを比較することでわかります。
  • 上記の基準は、Equalインスタンスとして渡すことができます。

コード:

xss.nub(new Equal<List<Integer>>() {
  public boolean eq(List<Integer> xs1, List<Integer> xs2) {
    Set<Integer> s1 = Set.iterableSet(Ord.listOrd(Ord.intOrd), xs1);
    Set<Integer> s2 = Set.iterableSet(Ord.listord(Ord.intOrd), xs2);
    return Equal.setEqual(Equal.intEqual).eq(s1, s2);
  }
});
于 2012-06-03T17:28:09.907 に答える
0
// lets create table
int[][] int2d = { 
        { 1, 2 }, 
        { 2, 1 }, 
        { 30, 40, 50 }, 
        { 50, 30, 40 },
        { 30, 40, 50 }, };

// lets sort content of each row for
for (int[] row : int2d)
    Arrays.sort(row);
// lets see how table looks likne now
System.out.println(Arrays.deepToString(int2d));

// this will help set do decide if element is already in
Comparator<int[]> comparator = new Comparator<int[]>() {
    public int compare(int[] o1, int[] o2) {
        return Arrays.toString(o1).compareTo(Arrays.toString(o2));
    }
};

// we create set and give him comparator (via constructor)
Set<int[]> set = new TreeSet<int[]>(comparator);
// now lets try to put every row of table in set
for (int[] row : int2d)
    set.add(row);

// NOW, GREAT TEST
System.out.println("============");
for (int[] row : set)
    System.out.println(Arrays.toString(row));

アウト:

[[1, 2], [1, 2], [30, 40, 50], [30, 40, 50], [30, 40, 50]]
============
[1, 2]
[30, 40, 50]
于 2012-05-28T11:33:48.067 に答える
0

これは、重複を定義したとおりに重複を排除する最小限のコードです。

final Integer[][] int2d = { { 30, 40, 50 }, { 50, 30, 40 }, { 30, 40, 50 }, };
final Set<Set<Integer>> r = new LinkedHashSet<Set<Integer>>();
for (Integer[] row : int2d) r.add(new LinkedHashSet<Integer>(Arrays.asList(row)));
System.out.println(r);
于 2012-05-28T12:05:56.250 に答える