我有一个方法可以从输入字符串中查找最小的substring
,其中包含A
,C
,G
,T
个字母组。
我的问题与算法无关。
我想保留原始HashMap
并将其分配给外部for循环末尾的修改后的地图,但原始的HashMap
会被修改,即使我从未修改过{{1}在代码中。
我不确定我做错了。
代码:
originalMap
答案 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