Получение неверного значения из Map<String, Map <String, Object >>
Я столкнулся с проблемой, когда пытался получить значения из карты. Вот подробности.
Я объявил эту структуру:
Map<String, Map<String, IrregularWord>> result4 = new TreeMap<>();
В качестве ключей я использовал строки вроде 2_5_1
, 3_5_1
, 21_4_2
и т. д. Когда я заполнил result4
У меня был такой результат ,
Затем я попытался прочитать все значения из result4
и сделай с ними что-нибудь
for (String key : result4.keySet()) {
Map<String, IrregularWord> words = result4.get(key);
// other code
}
когда key == 2_5_1
я имел words.size() == 14
не 9, как это на самом деле result4
,
Обновление: правильное значение для этого примера 9
,
У меня вопрос, почему я получил неправильный результат? Может быть проблема в алгоритме хеширования Map?
Спасибо за помощь.
1 ответ
Я не знаю почему, но все проблемы от меня Comparator
который я не написал здесь, и это была моя ошибка.
Итак, я действительно использовал
Map<String, Map<String, IrregularWord>> result4 = new TreeMap<>(new LessonsShortPathComparator());
Comparator
:
public class LessonsShortPathComparator implements Comparator<String> {
public static String LES_SHORT_PATH_REG_EXP = "[0-9]+_[0-9]+_[0-9]+";
public int compare(String o1, String o2) {
String[] o1Str = o1.split("_");
String[] o2Str = o2.split("_");
if (Integer.parseInt(o1Str[0]) > Integer.parseInt(o2Str[0]))
return 1;
if (Integer.parseInt(o1Str[1]) > Integer.parseInt(o2Str[1]))
return 1;
if (Integer.parseInt(o1Str[2]) > Integer.parseInt(o2Str[2]))
return 1;
return 0;
} else
return o1.compareTo(o2);
}
}
Здесь проблема. Я сравниваю только для большей ценности, но не включать меньше. Когда я исправляю это так:
public class LessonsShortPathComparator implements Comparator<String> {
public static String LES_SHORT_PATH_REG_EXP = "[0-9]+_[0-9]+_[0-9]+";
public int compare(String o1, String o2) {
if (o1.matches(LES_SHORT_PATH_REG_EXP) && o2.matches(LES_SHORT_PATH_REG_EXP)) {
String[] o1Str = o1.split("_");
String[] o2Str = o2.split("_");
for (int i = 0; i < o1Str.length; i++) {
int i1 = Integer.parseInt(o1Str[i]);
int i2 = Integer.parseInt(o2Str[i]);
if (i1 - i2 != 0) {
return i1 - i2;
}
}
return 0;
} else
return o1.compareTo(o2);
}
}
теперь все работает нормально. И я не понимаю, почему? Может быть, ссылки на IrregularWord
стало плохо после моего Comparator
, Ели всего TreeMap
сравните ключи и найдите правильное место для значения, но не наоборот.
Извините за неполное описание. Я действительно не знаю, что Comparator
может повлиять на это.