在下面的示例中,BigSet
HashSet由SmallSet
HashSet组成。我想清除SmallSet
而不清除BigSet
。
相反,当我在clear()
上执行SmallSet
命令时,BigSet
也会被清除。为什么会这样?我怎样才能清除SmallSet
,同时保持BigSet
完整无缺?
我已经包含了印刷陈述来说明正在发生的事情。
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]]]
[]
[[]]
答案 0 :(得分:1)
将SmallSet
添加到BigSet
时,您需要添加集合本身,而不是其中的集合。所以你可以
BigSet.add(new HashSet(SmallSet));
或
BigSet.addAll(SmallSet);
我个人推荐以后。
但请注意,因为您将Set
添加到小集中,如果您执行了以下操作:
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]
因为它是SET而不是添加到BigSet
的SET元素。
另外,当我在学校做这样的事情的时候,我强烈建议我画一些盒子&#34; - 黑板或白板或纸上的物理盒。在这种情况下,您甚至可能希望使用记事卡并将它们放在彼此之上以显示其中的内容。它确实有助于将你的大脑包裹起来。
答案 1 :(得分:1)
当您清除bigSet
时清除smallSet
,这是不正确的。 smallSet
仍在bigSet
内,只是它现在是空的(因为你清除了它)。因此,当您从print语句中看到[[]]
时,它告诉您bigSet
现在包含一个空集(特别是现在为空的smallSet
)。
我怀疑您的误解是,您在想象bigSet
在添加smallSet
时正在复制smallSet
。它不是。它添加了对变量smallSet.clear
引用的同一对象的引用。当您致电bigSet
时,您正在清除变量和smallSet
引用的设定对象。
如果你真的想在bigSet
内找到smallSet
的副本,最简单的方法就是创建一个新集而不是清除bigSet.add(smallSet);
smallSet = new HashSet<>();
:
'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'