Получение неверного значения из Map<String, Map <String, Object >>

Я столкнулся с проблемой, когда пытался получить значения из карты. Вот подробности.

Я объявил эту структуру:

Map<String, Map<String, IrregularWord>> result4 = new TreeMap<>();

В качестве ключей я использовал строки вроде 2_5_1, 3_5_1, 21_4_2 и т. д. Когда я заполнил result4У меня был такой результат заполненный результат4,

Затем я попытался прочитать все значения из 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 может повлиять на это.

Другие вопросы по тегам