Наборы глубокого сравнения в Java - PullRequest
10 голосов
/ 19 декабря 2010

У меня есть два набора в Java, которые сравнивают Item объекты.Есть ли метод для сравнения наборов, чтобы вызывался метод Item equals, а не просто сравнивать ссылки?

Ответы [ 2 ]

9 голосов
/ 19 декабря 2010

Каждый ребенок AbstractSet делает это.См. документы

public boolean equals(Object o)

Сравнивает указанный объект с этим набором на равенство.Возвращает true, если данный объект также является набором, два набора имеют одинаковый размер, и каждый член данного набора содержится в этом наборе.Это гарантирует, что метод equals работает правильно в разных реализациях интерфейса Set.Эта реализация сначала проверяет, является ли указанный объект этим набором;если это так, он возвращает истину.Затем он проверяет, является ли указанный объект набором, размер которого идентичен размеру этого набора;если нет, возвращается false.Если это так, он возвращает значение содержитAll ((Коллекция) o).

Таким образом, фактически это зависит от реализации contains (которая вызывается containsAll(..)).Для HashSet (по крайней мере) это то, что вы ищете.

4 голосов
/ 19 декабря 2010

Это поведение по умолчанию, если это не то, что вы видите, проверьте также, что вы переопределяете hashCode. См. Следующий код для примера:

public static void main(String[] args) {
    Set<Item> items1 = new HashSet<Item>();
    items1.add(new Item("item 1"));
    items1.add(new Item("item 2"));

    Set<Item> items2 = new HashSet<Item>();
    items2.add(new Item("item 1"));
    items2.add(new Item("item 2"));

    System.out.println(items1.equals(items2));
}

private static class Item {
    private String id;

    public Item(String id) {
        this.id = id;
    }

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

    @Override
    public boolean equals(Object obj) {
        return id.equals(((Item)obj).id);
    }
} 

Это выводит:

правда

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