LinkedHashSet没有删除

时间:2017-03-17 12:24:19

标签: java data-structures collections

我遇到了一种奇怪的行为,我不知道为什么。我尝试从eventRender: function(event, element) { $(element).qtip({ style: { classes: 'myStyle', height: 150, width: 300, textAlign: 'center', }, content: { title: event.room_id, text: "description: " + event.description + "<br/>" + "number: " + event.capacity + "<br/>" + "Name: " + event.name + "<br/>" + "Role: " + event.role + "<br/>" + "Rank: " + event.sub_role + "<br/>" + "Hours: " + event.hours + "<br/>", } }) } 中移除元素,但不会将其删除。

我的班级文件定义了:

LinkedHashSet

然后,当protected Set<Author> authors = new LinkedHashSet<>(); id相等时,作者等于::

role

然后通过一些调试打印删除的代码:

@Override
public int hashCode() {
    int hash = 7;
    hash = 53 * hash + Objects.hashCode(this.id);
    hash = 53 * hash + Objects.hashCode(this.role);
    System.out.println("Calling hashcode: " + hash);
    return hash;
}

@Override
public boolean equals(Object obj) {
    System.out.println("Calling equals");
    if (obj == null) {
        return false;
    }
    System.out.println("1");
    if (getClass() != obj.getClass()) {
        return false;
    }
    System.out.println("2");
    final Author other = (Author) obj;
    if (!Objects.equals(this.id, other.id)) {
        return false;
    }
    System.out.println("3");
    if (!Objects.equals(this.role, other.role)) {
        return false;
    }
    System.out.println("4");
    return true;
}

这将打印以下内容(我添加我的评论):

public void removeAuthor(Author author) {
    System.out.println(">removeAuthor [" + author.hashCode() + "]: " + author);
    if (document.getAuthors() != null) {
        System.out.println("[" + document.getAuthors().size() + "] Authors BEFORE:");
        document.getAuthors().forEach((pp) -> {
            System.out.println("[" + pp.hashCode() + "] " + pp);
        });
    }

    if (document != null) {
        if (document.getAuthors() != null) {
            document.getAuthors().remove(author);
        }
    }

    if (document.getAuthors() != null) {
        System.out.println("[" + document.getAuthors().size() + "] Authors AFTER:");
        document.getAuthors().forEach((pp) -> {
            System.out.println("[" + pp.hashCode() + "] " + pp);
        });
    }
}

我习惯使用套装。这可能是一个愚蠢的错误,但我无法找到它的位置。此外,compareTo或其他方法似乎不用于测试相等性。

1 个答案:

答案 0 :(得分:0)

由于调试,我认为我已经解决了这个问题。这是Ajax使用中的一个明显错误。创建/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/EventKit.framework时,元素将根据其LinkedHashSet添加到索引的哈希表中。有时,Ajax JSF操作可以更改内存中对象的hashCode,这会使它们更改其哈希值。但是,哈希表中最初插入的位置根本不会改变!因此,您现在有一个具有要删除的特定哈希的元素,该元素确实存在于您的Set中(如图所示,哈希值相同)但是当实际代码尝试从role中删除该元素时永远不会找到,因为它不在那个位置 - 它最初添加了另一个哈希值。这解决了这种错误,这是完全合乎逻辑的。