我有一個方法,它從包含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