通过执行诸如keepAll()之类的操作来更改哈希图值

时间:2018-09-23 15:03:11

标签: java hashmap

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一样保持不变。

2 个答案:

答案 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)

地图(或任何集合)只能包含对象的引用,而不能包含对象本身。当您将引用的副本放入集合中或从集合中获取引用时,您仅在复制参考,而不是底层对象。

从地图上获取一个集合并修改该集合时,该集合只有一个副本。

注意:更改地图中的地图时,地图不会被更改。

如果您想要集合的副本,则必须明确地做到这一点。