2015-03-12 4 views
2

Я думаю, что, возможно, я нашел ошибку на Java.Java TreeMap Duplicate Keys

У меня есть TreeMap, в котором я использую пользовательский компаратор. Однако, кажется, когда я кладу (ключ, значение) на уже существующий ключ, он не переопределяет ключ, создавая дубликаты ключей. Я думаю, что я проверил это, потому что я попробовал:

System.out.println(testMap.firstKey().equals(testMap.lastKey())); 

И это печатает правду. Кто-нибудь знает, почему это происходит?

Это код компаратора:

private class TestComp implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2){ 

     if (s1.equals(s2)) { 
      return 0; 
     } 
     int temp = otherMap.get(s1).compareTo(otherMap.get(s2)); 
     if (temp > 0) { 
      return 1; 
     } 
     return -1; 

    } 
+0

Сколько записей у вас есть в 'TreeMap'? Если это только один, первый и последний должны быть одинаковыми ^^ – Alexander

+0

Пожалуйста, покажите свой полный код. Из этой строки нельзя оценить, что вы делаете. –

+0

Вы уверены, что ваш компаратор является транзитивным и последовательным? – amit

ответ

6

Компаратор всегда должен возвращать согласованные результаты, а при использовании в TreeMap, согласуются с равными.

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

Пример: Если, например, otherMap карты

"a" -> "someString" 
"b" -> "someString" 

тогда как compare("a", "b") и compare("b", "a") вернется -1.


Обратите внимание, что если вы изменить реализацию в

if (s1.equals(s2)) { 
    return 0; 
} 
return otherMap.get(s1).compareTo(otherMap.get(s2)); 

вы нарушаете другие критерии того, чтобы быть в соответствии с равными, так как otherMap.get(s1).compareTo(otherMap.get(s2)) может вернуться 0 даже если s1 не равна s2.


Я подробно остановился на этом в самостоятельно ответил следить за вопрос here.


Из комментариев:

Даже если компаратор дает противоречивые результаты, если не язык Java еще не позволяют дубликаты ключей?

Нет, когда вы вставляете ключ, TreeMap будет использовать компаратор для поиска структуры данных, чтобы узнать, существует ли ключ. Если компаратор дает несогласованные результаты, TreeMap может искать не в том месте и заключить, что ключ не существует, что приводит к неопределенному поведению.

+0

Обновлен мой ответ за пару секунд до вашего комментария. – aioobe

+0

Еще одна возможность: компаратор не согласуется с equals(). есть действительно много вещей, которые могут пойти не так, и это невозможно узнать без дополнительного кода. – amit

+0

«Mutable keys может привести к неопределенному поведению». Это может быть не решение проблемы OP, но, безусловно, что-то нужно учитывать при использовании «Карты» и заслуживает +1 – antonio

Смежные вопросы