String [] keys0 =a.keySet(). toArray (new String[a.size()]);
Map< String , TreeSet <Integer>> Sub_hash=new HashMap< String, TreeSet <Integer>>();
for(ko = 0 ; ko < keys0 . length ; ko ++) {
Set<Integer> so = test.get( keys0[ko] );
System.out.println(""+so);
for(ko1 = ko+1 ; ko1 < keys0.length; ko1++) {
Set<Integer> so1 = test.get( keys0[ko1] );
boolean tr=so1.retainAll(so);
if(tr && so1.size()>=2) {
Sub_hash. put(keys0[ko]+keys0[ko1], (TreeSet<Integer>) so1);
System.out.println(""+Sub_hash.size()+""+Sub_hash);
}
}}
这是我的第二篇文章,我不知道如何整齐地发布,要求是我有一个包含键和值的哈希映射,我需要将其与映射中的一个键与映射中的另一个键进行比较,并保留值和将结果放入sub_hash映射中,但问题是映射的原始值随着通过方法keepAll()更新映射的值而改变; 但是当迭代到第二个键时,值会完全更改,但是比较会像这样2-3,2-4,2-5,2-6,2-7 ...等等 由于更改了值,结果是完全错误的,因此有可能使其像哈希图的某些变量final一样保持不变。
答案 0 :(得分:1)
这是您的问题:
Set<Integer> so1 = test.get( keys0[ko1] );
boolean tr=so1.retainAll(so);
您不想修改test
中的值。您要改为修改副本:
Set<Integer> so1 = new TreeSet<>(test.get( keys0[ko1] ));
boolean tr=so1.retainAll(so);
答案 1 :(得分:0)
地图(或任何集合)只能包含对象的引用,而不能包含对象本身。当您将引用的副本放入集合中或从集合中获取引用时,您仅在复制参考,而不是底层对象。
从地图上获取一个集合并修改该集合时,该集合只有一个副本。
注意:更改地图中的地图时,地图不会被更改。
如果您想要集合的副本,则必须明确地做到这一点。