我遇到了一种奇怪的行为,我不知道为什么。我尝试从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或其他方法似乎不用于测试相等性。
答案 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
中删除该元素时永远不会找到,因为它不在那个位置 - 它最初添加了另一个哈希值。这解决了这种错误,这是完全合乎逻辑的。