gpt4 book ai didi

java - 为什么 ".contains"会为直接从集合中提取的对象返回 false?

转载 作者:搜寻专家 更新时间:2023-11-01 01:28:20 25 4
gpt4 key购买 nike

private Collection<Episode> episodes = new ArrayList<Episode>();

public void checkEpisodes(String string) {
for(Episode episode : this.episodes){
System.out.println(string + this.episodes.contains(episode));
}
}

为什么上面的代码会打印错误?

我正在使用集合,因为这是 ormlite 允许的。我认为这个问题可能是由 ormlite 引起的,因为一个非常相似的类有一个打印 true 的相同方法。

我想做的是修改一个返回的对象:

public Episode findEpisode(int num) {
checkEpisodes("Find: ");
for(Episode episode : this.episodes) {
if(episode.getNumber()==num) {
return episode;
}
}
return null;
}

但不会保存对该对象的修改。我假设是因为它不包含在集合中。

我的解决方案有效但不理想:

public void modifyEpisode(Episode episode) {
checkEpisodes("Modify: ");
for (Iterator<?> it = this.episodes.iterator(); it.hasNext();) {
if (((Episode) it.next()).getNumber()==episode.getNumber()) {
it.remove();
addEpisode(episode.getNumber(), episode.getLink(), episode.getLinkLabel());
}
}
}

如果您需要查看我的更多代码,尽管询问,该项目有点复杂,但它托管在 sourceforge 上,如有必要,我可以发布指向它的链接。

最佳答案

for(Episode episode : this.episodes) {
System.out.println(string + this.episodes.contains(episode));
}

Why would the above code print false?

在一般意义上,使用标准集合,这是我可以查看您的 equals() 中是否存在错误的唯一方法方法。对于大多数 Collection ,contains()遍历集合并使用 equals() . Object.equals()会起作用,所以您可能已经覆盖了默认值 equals方法,其中有一个错误。

这也是ORMLite做。如果集合急切那么它调用contains()在内ArrayList对于将使用 equals() 的项目.如果集合是惰性,那么它会在整个表中使用迭代器,并再次使用equals()。查看是否匹配。

编辑:

啊哈。您声明您没有覆盖 equals()方法。

要记住的一件重要事情(就 ORMLite 而言)是这是一个惰性 集合,没有在内存中存储对象。当您遍历惰性集合时,您会得到一个 Episode 的实例。来自数据库的对象。然后,当您调用 contains() , 它再次迭代创建新的 Episode 的集合来自数据库的对象。它会尝试比较两个对象,但如果您使用 Object.equals(),它们将永远相等。因为有相同的对象引用。

必须覆盖 equals()获取contains()的方法为惰性集合工作。

此外,虽然您的帖子可能是对代码的简化,但您可以考虑将惰性集合拉入一个数组,然后对其进行迭代。你不能做 contains()在数组上,但如果您需要搜索数组,则不会在数据库中迭代两次。

编辑:

所以解决方案变得更加复杂。事实证明,OP 有一个 Show对象,急切收集 Season对象,每个对象都有另一个急切的 Episode 集合对象。默认情况下,每当 ORMLite 有嵌套的急切集合时,出于性能原因,内部集合就会变成一个惰性集合。不幸的是,这在 4.40 版中没有得到很好的记录。您可以通过设置 maxEagerLevel = 2 来更改它(或更多)在 Show 上对象的集合。查看documentation on maxEagerLevel .

@ForeignCollectionField(eager = false, maxEagerLevel = 2)
ForeignCollection<Season> seasons;

关于java - 为什么 ".contains"会为直接从集合中提取的对象返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com