Проблема с использованием Hashmap с пользовательским внутренним классом - PullRequest
1 голос
/ 22 июля 2011

У меня есть код, который выглядит следующим образом:

private void MethodToDo(SpecialObject o) {
    Map<InfoObj, Integer> totalNeeds = new HashMap<InfoObj, Integer>();

    for (ListObject obj : o.getListOfObjects()) {
        InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId());
        Integer need = totalNeeds.get(infoObj);

        if (need == null) {
           need = new Integer(obj.getNeeded());
        } else {
           need = need + obj.getNeeded();
        }
        totalNeeds.put(infoObj, need); 
    }
}

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

private class InfoObj {
    private String  title;
    private Integer id;

    public InfoObj(String title, Integer id) {
        this.title = title;
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public Integer getId() {
        return id;
    }

    @Override 
    public boolean equals(Object io2) {
        if (this == io2) { return true; }
        if ( !(io2 instanceof InfoObj) ) { return false; }
        InfoObj temp = (InfoObj) io2;
        return this.id.equals(temp.id) && this.title.equals(temp.title);
    }

    @Override
    public int hashCode() {
        final int prime = 7;
        int result = 1;
        result = prime * result
                + ((this.title == null) ? 0 : this.title.hashCode());
        result = prime * result
                + ((this.id == null) ? 0 : this.id.hashCode());
        return result;
    }

Однако, несмотря на переопределение методов equals и hashCode, hashMap будет по-прежнему содержать ключи повторения (как в заголовке и id, эквивалентны ... но все равно отображаются в нескольких местах). Я думаю, что все делаю правильно, но понимаю, что могу что-то упустить ...

Кроме того, я знаю, что есть ключи повторения, потому что я перебираю набор ключей и выводю результаты, в результате чего объекты с одинаковым заголовком и идентификатором появляются несколько раз.

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Согласно вашему комментарию, HashMap не может содержать одинаковые ключи для реализации, тот же ключ будет:

(e.hash == hash && ((k = e.key) == key || key.equals(k)))

И так как вы следуете контракту на наличие равных и хэш-кода, любой объект, который вы создаете здесь:

InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId());

С тем же идентификатором и заголовком будет считаться тем же key, и если карта ранее содержала сопоставление для ключа, старое значение заменяется.

0 голосов
/ 22 июля 2011

Похоже, все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...