複数HashSet
のIntegers
要素で、重複のない要素をすべて取得したいと考えています。つまり、すべての結合で一度だけ来ましたHashSet
。プログラムで概念化することはできません。
例として、最初のセットに {2,4,6,8,9} が含まれ、2 番目のセットに {2,8,9} が含まれ、3 番目のセットに {2,4,8,9} が含まれているとします。これらすべてのセットで、要素 6 は 1 回だけ発生します。
Javaの整数の複数のHashSetで重複していないすべての要素を見つける方法は?
7 に答える
少なくとも 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 回出現する要素) になりました。- から削除
twice
しonce
ます。once
現在 {6} です。戻るonce
。
@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;
}
});
}
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;
}
マルチセットを作成し、カウント 1 のすべての要素を引き出して反復処理します O(n)
。
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);
}
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 回だけ見られた整数が含まれます。
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);
}
}