5

複数HashSetIntegers要素で、重複のない要素をすべて取得したいと考えています。つまり、すべての結合で一度だけ来ましたHashSet。プログラムで概念化することはできません。

例として、最初のセットに {2,4,6,8,9} が含まれ、2 番目のセットに {2,8,9} が含まれ、3 番目のセットに {2,4,8,9} が含まれているとします。これらすべてのセットで、要素 6 は 1 回だけ発生します。

Javaの整数の複数のHashSetで重複していないすべての要素を見つける方法は?

4

7 に答える 7

4

少なくとも 1 回および少なくとも 2 回発生する要素のセットを保持できます。手動ループが少しありますが、可能です。これは、任意の数の差に対して機能し、入力を変更しません。

public static Set<E> unique(Set<? extends E>... sets){
   Set<E> once = new HashSet<E>();
   Set<E> twice = new HashSet<E>();

   for(Set<? extends E> set:sets){
      for(E el:set){
         if(once.contains(el)){
            twice.add(el);
         } else {
            once.add(el);
         }
      }
   }

   once.removeAll(twice);
   return once;
} 

イデオネ: http://ideone.com/reGDBy

使用例:

Set<Integer> set1, set2, set3;
...
Set<Integer> u = unique(set1, set2, set3);

評価例:

例として、最初のセットに {2,4,6,8,9} が含まれ、2 番目のセットに {2,8,9} が含まれ、3 番目のセットに {2,4,8,9} が含まれているとします。これらすべてのセットで、要素 6 は 1 回だけ発生します。

  • 最初の内部ループが完了すると、once{2,4,6,8,9} が含まれ、twice空になります。
  • 2 番目のセットの追加: 2、8、および 9 は既にonceセットに含まれているため、セットに追加さtwiceれます。
  • once{2,4,6,8,9} にtwiceなり、{2,8,9} になりました。
  • 3 番目のセットから: に 2 が追加されtwice、 に 4 が追加されtwice、 に 8、9 が追加されtwiceます。
  • once{2,4,6,8,9} (すべてのセットの結合) にtwiceなり、{2,4,8,9} (少なくとも 2 回出現する要素) になりました。
  • から削除twiceonceます。once現在 {6} です。戻るonce
于 2012-12-08T14:33:14.137 に答える
1

中間Multisetを使用するGuavaバージョン:

@SafeVarargs
public static <E> Set<E> uniqueElements(Set<? extends E>... sets) {
    final Multiset<E> multiset = HashMultiset.create();
    for (Set<? extends E> set : sets) {
        multiset.addAll(set);
    }
    return Sets.filter(multiset.elementSet(), new Predicate<E>() {
        @Override
        public boolean apply(E element) {
            return multiset.count(element) == 1;
        }
    });
}
于 2012-12-08T16:28:11.240 に答える
1

contains()メソッドを使用してそれを行うことができます。まず、他のすべてのセットから新しい HashSet を作成します。次に、このセットを反復処理し、他のセットcontains()が指定された要素を設定しているかどうかを確認します。2 つ以上のリストにそれが含まれている場合、重複した and can がありますcontinue。要素を含むセットが 1 つだけの場合は、たとえば別の結果セットのどこかに格納できます。

必要なものを達成するためのユーティリティメソッドを作成しました:

public static <E> HashSet<E> uniques(HashSet<E>... sets){
    HashSet<E> everything = new HashSet<E>();
    for(HashSet<E> set : sets){
        everything.addAll(set);
    }
    HashSet<E> uniques = new HashSet<E>();
    for(E e : everything){
        int count = 0;
        for(HashSet<E> set : sets){
            if(set.contains(e)){
                count++;
            }
            if(count > 1){
                break;
            }
        }
        if(count == 1){
            uniques.add(e);
        }

    }
    return uniques;
}
于 2012-12-08T14:36:30.740 に答える
0

マルチセットを作成し、カウント 1 のすべての要素を引き出して反復処理します O(n)

于 2012-12-08T14:33:54.767 に答える
0
 public static void main(String[] args) {
        HashSet<Integer> set1 = new HashSet<Integer>();

        set1.add(2);
        set1.add(4);
        set1.add(6);
        set1.add(8);
        set1.add(9);
        HashSet<Integer> set2 = new HashSet<Integer>();
        set2.add(2);
        set2.add(8);
        set2.add(9);
        HashSet<Integer> set3 = new HashSet<Integer>();
        set3.add(2);
        set3.add(4);
        set3.add(8);
        set3.add(9);
        set1.removeAll(set2);
        set1.removeAll(set3);
        System.out.println(set1);
    }
于 2012-12-08T14:34:01.127 に答える
0

2 つの新しいハッシュセットを作成するのはどうでしょうか。seenOnce および seenMoreThenOnce と呼ばれます。

次に、さまざまなハッシュマップですべての整数を反復処理します。

For each integer:
   If it is in seenMoreThenOnce do nothing.
   else If it is in seenOnce, remove it from seenOnce and add it to seenMoreThenOnce
   Else add it to seenOnce.

すべてのハッシュマップの反復処理が完了すると、seenOnce には 1 回だけ見られた整数が含まれます。

于 2012-12-08T14:35:23.460 に答える
-1
public class test {

public static void main(String[] args) throws Exception, IOException {

    int count=0;
    HashSet<Integer> set1 = new HashSet<Integer>();
    HashMap<Integer, String> ee=new HashMap<Integer,String>();
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("how many elements u want to store");
    int n=Integer.parseInt(br.readLine());
    System.out.println("enter te element u want insert");
    for(int i=0;i<n;i++)
    {
        boolean x=set1.add(Integer.parseInt(br.readLine()));
        if(x==false)
        {
            count++;
        }
    }
    System.out.println("no of duplicate elements is   "+count);
    }
}
于 2013-09-15T16:21:00.577 に答える