2016-02-04 4 views
0

У меня есть HashMap следующего HashMapHashMap возвращает неверное значение для Integer ключа

private Map<Integer, List<CustomClass>> map = new HashMap<>();

Я пытаюсь добавить новую запись в HashMap против ключа Integer и, если ключ существует, то я хочу выберите соответствующий список и добавьте в него новый элемент. Код приведен ниже.

 if (this.map.containsKey(//Integer Key)) { 
      this.map.get(//Integer Key).add(//New List Item); 
     } else { 
      List<CustomClass> customClass = new ArrayList<>(); 
      customClass.add(new CustomClass()); 
      this.map.put(//Integer Key, customClass); 
     } 

Реальная проблема заключается в той части, где уже существует ключ, и я пытаюсь использовать HashMap получить функцию

this.map.get(//Integer Key).add(//New List Item);

Это не дает нуль, если не может найти значение Целочисленный ключ, но он довольно часто дает неправильный ArrayList. Теперь я знаю, что HashMap работает с equals и hashCode, поэтому я попытался переопределить эти функции и использовать их вместо Integer Key.

public class CustomHashMapIntegerKey { 

    private Integer key = 0; 

    public void setKey(Integer key) { 
     this.key = key; 
    } 

    public Integer getKey() { 
     return this.key; 
    } 

    @Override 
    public int hashCode() { 
     return this.key.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) return true; 
     if (null == obj) return false; 
     if (this.getClass() != obj.getClass()) return false; 
     final CustomHashMapIntegerKey customHashMapIntegerKey = (CustomHashMapIntegerKey) obj; 
     if (null == this.key && null != customHashMapIntegerKey.getKey()) return false; 
     if (null != this.key) { 
      if (!this.key.equals(customHashMapIntegerKey.getKey())) return false; 
     } 
     return true; 
    } 
} 

и изменил мою карту, чтобы использовать этот новый класс для ключа вместо Integer, но я до сих пор застрял на одной и той же задачи, где HashMap, дает неверное значение. Немного детальный пропущено доступен по этой ссылке https://gist.github.com/MAnfal/dc581234ce597a8ff062

+4

Если в HashMap произошла ошибка, вы могли бы узнать об этом в поиске Google (и это уже было исправлено) , Java.lang.Integer также очень маловероятен, чтобы иметь ошибки. Наиболее вероятной причиной вашей проблемы является то, что вы отправляете неправильное целое число в метод «Map.get()». –

+0

Я дважды проверял использование отладчика, включая instanceof, value, логическое значение моего ключа и полученный из hashmap. Я не говорю, что его ошибка Java, но как-то все, что я пробовал, не дает мне подходящего результата. – userunknown

+1

Хеширование зависит от ключа, и если это целое число, то вряд ли «дать [вам] ошибку ArrayList». Повторно проверьте свой код. – Rishav

ответ

2

HashMap частично полагается на equals и hashCode делать свою работу, но это немного сложнее. Взгляните на this article для подробного объяснения.

Для вашего purose (карта со списком в качестве значения), я предлагаю использовать Multimap из библиотеки Гуава Google:

ListMultimap<Integer, String> multimap = ArrayListMultimap.create(); 
multimap.put(4, "Is the first digit of '4'"); 
multimap.put(4, "Is the first digit of '42'"); 
multimap.put(4, "Is the first digit of '4711'"); 
multimap.put(1, "Is the first digit of '13'"); 

Collection<String> values = multimap.get(4); 

Collectionvalues будет содержать три элементов, входящих, добавленные под ключ 4 ,

+1

Я знаю, что HashMap использует hashCode и равно, и спасибо за предложение, но я буду продолжать использовать Guava, я не хочу использовать всю библиотеку для одной функции, которую я могу достичь через ядро ​​Java. – userunknown

0

Сомневаюсь, что значения хранятся на вашей карте. С подробностями, которые вы предоставили, ваша проблема может произойти только в одном случае, когда вы должны добавлять один и тот же объект в разные списки и хранить с помощью разных ключей в HashMap. Запишите содержимое своей карты и распечатайте хэш-коды объектов, которые могут вам помочь

+0

Я проверил журнал. Я добавляю разные объекты в том же списке, что и обычное, что эти объекты имеют с картой, это идентификатор элемента (переданный как ключ к карте). И для объединения элементов с таким же идентификатором в списке массивов я использовал эту структуру данных. – userunknown

+0

Можете ли вы поделиться кодом, в котором этот метод вызывается? – Sathiesh

+0

Говорите, если элементы имеют id как 3 и хранятся в списке и помещаются на карту с помощью ключа 3, то в следующий раз, когда вы получите элемент с идентификатором 3, он должен получить список, в котором все элементы имеют тот же самый идентификатор. Но то, что вы видите, - это список с элементами, чей идентификатор элемента является чем-то другим. правильно ли я понимаю? – Sathiesh

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