原始HashMap已修改

时间:2016-09-20 05:49:19

标签: java hashmap copy

我有一个方法可以从输入字符串中查找最小的substring,其中包含ACGT个字母组。

我的问题与算法无关。

我想保留原始HashMap并将其分配给外部for循环末尾的修改后的地图,但原始的HashMap会被修改,即使我从未修改过{{1}在代码中。

我不确定我做错了。

代码

originalMap

3 个答案:

答案 0 :(得分:0)

我认为你应该这样做

Map map = new HashMap(); // generic later
map.putAll(originalMap);

而不是

map = originalMap;

这只会将引用更改为指向原始hashmap。因此,在第二次迭代中,修改了原始hashmap。你需要的是创建副本。

答案 1 :(得分:0)

在进入for循环内部时,创建一个新的hashmap,它是原始的hashmap的副本:

Map<SomeType, OtherType> map1 = new HashMap<SomeType, OtherType>(original); 

不建议使用putAll ,因为它不会丢弃目标hashmap中已存在的条目。 Demo

   HashMap newmap1 = new HashMap();
   HashMap newmap2 = new HashMap();

   // populate hash map
   newmap1.put(1, "tutorials");
   newmap1.put(2, "point");
   newmap1.put(3, "is best");
   newmap2.put(5, "Foo");

   System.out.println("Values in newmap1: "+ newmap1);
   System.out.println("Values in newmap2: "+ newmap2);   
   newmap2.putAll(newmap1);
   System.out.println("Values in newmap2: "+ newmap2);

输出为:

Values in newmap1: {1=tutorials, 2=point, 3=is best}
Values in newmap2: {5=Foo}
Values in newmap2: {1=tutorials, 2=point, 3=is best, 5=Foo}

使用{5, "Foo"}后,您可以看到条目putAll 保持完整,但如果您希望重新获得原始hashmap,则无法预料。

修改

因为,尽可能suggested to avoid 新的地图实例创建,在.clear() + .putAll()循环结束时使用for操作。

答案 2 :(得分:0)

在循环开始时使用原始地图的副本创建map的其他答案更好,但遵循现有逻辑:

    map = originalMap; // <--------

应该成为

    map.clear();
    map.putAll(originalMap);

还有几个提示:

HashMap<Character, Integer> countMap = new HashMap<Character, Integer>();

可以变得更抽象Map,推断类型<>

Map<Character, Integer> countMap = new HashMap<>();

使用java 8:

    if (!countMap.containsKey(currentChar)) {
        countMap.put(currentChar, 1);
    } else {
        Integer count = countMap.get(currentChar);
        count++;
        countMap.put(currentChar, count);
    }

可以成为单行

    countMap.merge(currentChar, 1, Integer::add);
                   ===========  =  ============
                    |           |     |
                    |           |    function(old, 1) when old value exists
                    |           |    returns new value or null to delete
                    |           |
                    |          new value when no value (or null value)
                   key