2017-11-08 3 views
0

以下の例では、BigSetハッシュセットはSmallSetハッシュセットで構成されています。 BigSetを消去せずにSmallSetをクリアしたいと思います。Java:ハッシュセットのハッシュセットを更新する

代わりにSmallSetclear()コマンドを実行すると、BigSetもクリアされます。なぜこれが起こるのですか?そしてBigSetをそのまま残して、どうすればSmallSetをクリアするだけですか?

何が起こっているのかを説明するために、printステートメントが含まれています。

import java.util.HashSet; 
import java.util.Set; 
import java.util.Arrays; 

public class G{ 
    public static final HashSet<HashSet> BigSet = new HashSet <HashSet>(); 
    public static final HashSet<Set> SmallSet = new HashSet<Set>(); 

    public static Set<Integer> method() { 
     Set<Integer> n = new HashSet<Integer>(Arrays.asList(10, 20, 30)); 
     SmallSet.add(n); 
     BigSet.add(SmallSet); 
     System.out.println(SmallSet); 
     System.out.println(BigSet); 
     SmallSet.clear(); 
     System.out.println(SmallSet); 
     System.out.println(BigSet); 
     return n; 
    } 

    public static void main(String[] args) { 
     method(); 
    } 
} 

出力:

[[20, 10, 30]] 
[[[20, 10, 30]]] 
[] 
[[]] 

答えて

1

あなたはBigSetSmallSetを追加するときは、セット自体ではなく、その内部のセットを追加します。だから、私は個人的に、後をお勧めします

BigSet.add(new HashSet(SmallSet)); 

または

BigSet.addAll(SmallSet); 

のいずれかをできました。

次なかった場合は、小さなセットにSetを追加しているので、ことに注意してください、:それはBigSetに追加されたSETはなくSET'S ELEMENTSだから

Set<Integer> n = new HashSet<Integer>(Arrays.asList(10, 20, 30)); 
    SmallSet.add(n); 
    BigSet.addAll(SmallSet); 
    n.remove(20); 
    System.out.println(BigSet); 

あなたは[10, 30]になるだろう。

また、私は学校でこのようなことをしていたときに、物理的な箱を黒板やホワイトボードや紙に描くことを強く勧めました。この場合は、メモカードを使用して上に置いて、何がどこにあるかを示すことさえできます。それは本当にあなたの脳を包むのに役立ちます。

+0

OPはbigSetがセットを含むセットであることを述べています。私はOPが追加する要素を探しているとは思わない。 – sprinter

+0

多くの意味があります。 BigSet.add(新しいHashSet(SmallSet))は私が探していたものです。ありがとう – haxtar

+1

私は 'BigSet.add(新しいHashSet ...)'と 'BigSet.addAll(...) '全く同じことをしますが、addAllは' SmallSet'から 'new HashSet'にダンプする必要がないため、倍速が2倍です。私は非常に 'addAll'を' add(new' – corsiKa

1

smallSetを消去すると、bigSetをクリアすることが間違っています。 smallSetはまだbigSetの中にあります。だから、[[]]をprintステートメントから見ると、bigSetには空の1組(今は空のsmallSet)が含まれていることを伝えています。

あなたが誤解していると思うのは、bigSetが追加時にsmallSetのコピーを取っていると想像していると思います。そうではありません。これは変数smallSetで参照される同じオブジェクトへの参照を追加しています。 smallSet.clearに電話すると、変数とbigSetの両方によって参照される設定オブジェクトが消去されます。

あなたが実際にbigSetsmallSetのコピーを望んでいた場合に行うための最も簡単なものではなく、smallSetをクリアの新しいセットを作成するには、次のようになります。

bigSet.add(smallSet); 
smallSet = new HashSet<>(); 
+0

)することをお勧めします;これはまさに私が言っていることです。あなたが言っているように、解決策はSmallSetの新しいHashSetです。 – haxtar

関連する問題