1

重複した値を含むすべてのリストがあります。どうにかして一意の値のみを取得し、別のリストまたはセットに保存して、操作を実行できるようにします。私のコード:

{
        List<Integer[]> list1 = new ArrayList<Integer[]>();
          list1.add(new Integer[] { 1,10 });
            list1.add(new Integer[] { 1,10 });
            list1.add(new Integer[] { 1,10 });      
            list1.add(new Integer[] { 2,10 });
            list1.add(new Integer[] { 1,10 });
            list1.add(new Integer[] { 3,10 });

        for(int i=0;i<list1.size();i++)
        {
            System.out.println("I - 0 :"+list1.get(i)[0]+"\t I - 1 :"+list1.get(i)[1]+"\n");
        }

        Set<Integer[]> uniquelist = new HashSet<Integer[]>(list1);

        for(Integer[] number: uniquelist){
              System.out.println(number[0]+"\t"+number[1]);
            }
    }    

結果{1,10;2,10;3,10}を別のリストに入れたい.グーグルで検索したとき、一意の場合はsetを使用する必要があることを知りましたが、Set<Integer[]> uniquelist = new HashSet<Integer[]>(list1);これを行った後、各要素にアクセスする方法がわかりません よろしくお願いします

Output:
1   10
2   10
1   10
3   10
1   10
1   10
4

8 に答える 8

4

Set通常のアプローチでは、望む結果は得られません。あなたListが含むInteger[]ので、デフォルトでは一意とは見なされません。すべての配列オブジェクトは異なります。したがって、Setリストと同じ要素が含まれます。ただし、 を定義Custom Comparatorして、TreeSetコンストラクターで使用することはできます。

contains(List<Integer[]> list, Integer[] value)それを行う別の方法は、リストにその配列が含まれているかどうかを確認するメソッドを定義することです。という名前のリストを定義しますuniqueList。ここで、元のリストを繰り返し処理し、値ごとに、パラメーターとしてcontains渡すメソッドuniqueListとそれを呼び出しvalueます。

containsメソッドは次のようになります。

public static boolean contains(List<Integer[]> list, Integer[] value) {
    for (Integer[] arr: list) {
        // We can compare two arrays using `Arrays.equals` method.
        if (Arrays.equals(arr, value)) {
            return true;
        }
    }
    return false;
}

したがって、封じ込めをチェックすることは、単に を探す方法と同じではないことがわかりますInteger

今、あなたのmain方法から、このコードを使用してください: -

List<Integer[]> unique = new ArrayList<Integer[]>();

for (Integer[] arr: list1) {
    // Use your method here, to test whether this value - `arr` 
    // is already in `unique` List or not. If not, then add it.
    if (!contains(unique, arr)) {
        unique.add(arr);
    }
}

for (Integer[] arr: unique) {
    System.out.println(arr);
}
于 2013-01-21T09:06:39.657 に答える
3

Setこの場合、実装を使用したいと思います。要素を並べ替える場合に使用LinkedHashSetします。

ペアを保持するクラス IntegerPair を宣言できます。

class IntegerPair {
  private int key;

  private int value;

  public IntegerPair(int k, int v) {
    key = k;
    value = v;
  }

  public int getKey() {
    return key;
  }

  public int getValue() {
    return value;
  }

  public int hashCode() {
    return key * value;
  }

  public boolean equals(Object o) {
    if (!(o instanceof IntegerPair)) {
      return false;
    }
    IntegerPair other = (IntegerPair) o;
    return key == other.key && value == other.value;
  }
}

次のように宣言します。

Set<IntegerPair> set = new LinkedHashSet<IntegerPair>();

new Integer[]値を入れる代わりに、set.add(new IntegerPair(1, 10));

foreach アプローチを使用して要素をループできます。

for (IntegerPair value : set) {
  System.out.println(value.getKey() + "  =  " + value.getValue());
} 
于 2013-01-21T09:04:37.313 に答える
1

次のようなカスタム コンパレータを使用して、それらをセットに入れます。

new TreeSet(list1, new Comparator<Integer[]>() {
    public int compare(Integer[] one, Integer[] two) {
        int n = one.length;
        for (int i = 0;  i < n;  i++) {
              int comp = one.compareTo(two);
              if (comp != 0) {
                   return comp;
              }
        }
        return 0;
    }
});

TreeSetカスタムコンパレータを受け入れることができるものを使用したことに注意してください。これは、配列を扱っているためです。ただし、2 つの int 値を保持する独自のクラスを定義すると、実装することがequals()できhashCode()、任意の Set 実装を使用できます。

于 2013-01-21T09:13:29.820 に答える
1

Iteratorfor each ループによって、または for each ループを使用して、要素にアクセスできます。

for(Integer number: setOfNumbers){
  System.out.println(number);
}
于 2013-01-21T09:03:50.363 に答える
1

問題 :

明らかに、セットが..

重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。

しかし、あなたの場合、..のようなリストに追加しています

List<Integer[]> list1 = new ArrayList<Integer[]>();
list1.add(new Integer[] { 1,10 });
list1.add(new Integer[] { 1,10 });
list1.add(new Integer[] { 1,10 });      
list1.add(new Integer[] { 2,10 });
list1.add(new Integer[] { 1,10 });
list1.add(new Integer[] { 3,10 });

ここでnew Integer[] { 1,10 }は毎回異なるオブジェクトであるため、すべてのオブジェクトが追加されます。

解決策:
単に解決策は、リストに(要件に応じて)重複する整数配列を追加できないように注意する必要があることです。

そのため、その配列がリストに追加されていない場合は天気をチェックできるメソッドを1つ作成し、リストにない場合はそれを追加できます。

public void addUnique(List<Integer[]> list, Integer[] newValue) {
    for (Integer[] array: list) {
        //Compare two arrays using `Arrays.equals` method.
        if (Arrays.equals(array, newValue)) {
            list.add(newValue)
        }
    }
}

次のように呼び出しを追加します..

List<Integer[]> list1 = new ArrayList<Integer[]>();
addUnique(list1  , new Integer[] { 1,10 });
addUnique(list1  , new Integer[] { 1,10 });
addUnique(list1  , new Integer[] { 1,10 });
addUnique(list1  , new Integer[] { 2,10 });
addUnique(list1  , new Integer[] { 1,10 });
addUnique(list1  , new Integer[] { 3,10 });
于 2013-01-21T09:29:02.413 に答える
0

これはあなたを助けるかもしれません...

public static void main(String [] args){
    Set<Integer []> set = new TreeSet<Integer []>(new Comparator<Integer[]>(){
        public int compare(Integer[] o1, Integer[] o2) {
            if(o1.length == o2.length){
                for(int i = 0; i < o1.length; i++){
                    if(o1[i] != o2[i]){
                        return -1;
                    }
                }
                return 0;
            }
            return -1;
        }
    });

    set.add(new Integer[]{1,2});
    set.add(new Integer[]{1,2});
    set.add(new Integer[]{1,2});
    set.add(new Integer[]{1,3});

    int j = 0;
    for(Integer[] i: set){
        System.out.println("\nElements: "+j);
        j++;
        for(Integer k : i){
            System.out.print(k+" ");
        }
    }
}

Comparator同じの2つの要素を比較するためにを使用する必要があります。配列用のコンパレータがないため、Setは実際のオブジェクトを使用して比較します。コンパレータを使用すると、この2つの配列が同じであり、他の同じ配列を追加しないことをSetに通知する必要があります。

于 2013-01-21T09:20:26.007 に答える
0

Integer[] numberfor ループ内は配列です。内部の値を取得するには、number[index]命令を使用する必要があります。これを行うには、変数をインデックスとして使用して、従来の while または for ループを実行できます

for(int i=0;i<number.length;i++) {
...
}

または foreach ループ:

for(Integer num : number){
...
}
于 2013-01-21T09:16:25.830 に答える
0

Google-guavaでテーブルコレクションを試してください。

例 :

Table<Integer, Integer, Integer[]> sampleTable = HashBasedTable.create();
sampleTable.put(1, 10, new Integer[] { 1,10 });
sampleTable.put(2, 10, new Integer[] { 2,10 });
sampleTable.put(1, 10, new Integer[] { 1,10 });

したがって、重複する値が上書きされます。最後に、一意の値しかありません。

于 2013-01-21T09:14:21.187 に答える