我有一个方法,它从包含A
,C
,G
,T
字母组的输入字符串中寻找最小的substring
。原始HashMap被修改
我的问题与算法无关。
我想保持原来的HashMap
并指定为修改后的地图在外部for循环的结束,但原来HashMap
被修改,即使我从来不修改代码的originalMap
。
我不知道我是否做错了。
代码:
void find2(String string) {
int n = string.length();
int occurrence = n/4;
Map<Character, Integer> cache = new HashMap<Character, Integer>();
char[] original = { 'A', 'C', 'G', 'T' };
for (char c : original) {
cache.put(c, 0);
}
char[] chars = string.toCharArray();
char[] modifiableChars = string.toCharArray();
HashMap<Character, Integer> countMap = new HashMap<Character, Integer>();
for (int ii = 0; ii < string.length(); ii++) {
char currentChar = chars[ii];
if (!countMap.containsKey(currentChar)) {
countMap.put(currentChar, 1);
} else {
Integer count = countMap.get(currentChar);
count++;
countMap.put(currentChar, count);
}
}
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
HashMap<Character, Integer> originalMap = new HashMap<Character, Integer>();
for (int ii = 0; ii < string.length(); ii++) {
char c = string.charAt(ii);
if (!map.containsKey(c)) {
map.put(c, 1);
} else {
Integer count = map.get(c);
count++;
map.put(c, count);
}
if (!originalMap.containsKey(c)) {
originalMap.put(c, 1);
} else {
Integer count = originalMap.get(c);
count++;
originalMap.put(c, count);
}
}
int min = 0;
for (int i = 0; i < chars.length; i++) {
int change = 0;
int checkCount = countMap.get(chars[i]);
if (checkCount <= occurrence) {
continue;
}
boolean isValidated = false;
int j = i;
for (j = i; j < chars.length; j++) {
char c = chars[j];
int count = map.get(c);
if (count > occurrence) {
}
char nextChar = getNextChar(map, cache, occurrence);
if (nextChar == ' ') {
continue;
}
Integer nextCharCount = map.get(nextChar);
nextCharCount++;
map.put(nextChar, nextCharCount);
chars[j] = nextChar;
if (c != nextChar) {
Integer currentCount = map.get(c);
currentCount--;
map.put(c, currentCount);
}
change++;
// validate the characters.
if (isValid(chars, occurrence)) {
isValidated = true;
break;
}
}
if (isValidated) {
if (min == 0) {
min = change;
} else {
min = Math.min(min, change);
}
}
chars = string.toCharArray();
map = originalMap; // <--------
}
System.out.println(min);
}
'一个= someMap'不创建'someMap的副本“如果这是问题。如果您想要一个副本,请使用https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#HashMap-java.util.Map- – 2016-09-20 05:51:15
这段代码的要点是否应该这样做?你提到你没有修改'originalMap',但是我看到'originalMap.put(c,1);' –
''HashMap originalMap = new HashMap ();”正在初始化原始地图以包含每个字母的原始计数,因为'地图'被修改。 –
user826323