- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
编辑:我似乎问错了这个问题。 我正在尝试寻找一种方法来查询一个集合是否在另一个集合中可用。例如: SELECT * FROM something WHERE (1, 3) IN (1, 2, 3, 4
这两种方法似乎 produce the same results ,但我一直很难真正说服人们第二种方法有效,因为它显然并不为人所知。 // Create some data var foo = { '
我一直在学习Kotlin,并且遇到过Collections API。在Kotlin之前,我一直在学习Java,并且我知道Java中有很多不同类型的Collections API。例如,我们使用List
为什么我会得到不同的行为: Collection col2 = new ArrayList(col); 集合 col2 = new ArrayList(); col2.addAll(col) 我正在与
所以我有一个代表专辑信息的 JSON 对象。给定“function updateRecords(id, prop, value)”我希望能够更新每个条目。正确的完成代码如下。 我得到了指示,粗体部分,
我想存储一个对象集合,这些对象根据它们所代表的值进行键控。这些键可以重复。例如: [4] => Bob [5] => Mary [5] => Sue [9] => Steve [10] =>
在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。 确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递: public ArrayList(
我正在为 API 编写一个 swagger 定义文件。 API 是用于 GET 请求的 /path/to/my/api: get: summary: My Custom API d
我知道scala.collection包中有两个非常有用的对象,可以帮助我们实现这个目标: JavaConverters(如果我想明确说明并准确说明我要转换的内容) JavaConversions(如
我已经阅读了无数其他帖子,但似乎无法弄清楚发生了什么,所以是时候寻求帮助了。 我正在尝试将包含集合的域实体映射到也包含集合的 dtos。 这是一个原始示例; (我提前为代码墙道歉,我尽量保持简短):
我正在创建一个具有 ArrayList 的类,因此当我调用构造函数时,它会初始化该数组: public class ElementsList { private ArrayList list;
我正在阅读事件指南和指南的开头,它说: You can also add an event listener to any element in the this.$ collection using
我是 Python 新手,想知道如何使用键在字典中存储不同数据类型的列表 例如 - {[Key1,int1,int1,String1] , [Key2,int2,int2,String2], [Key
int[] mylist = { 2, 4, 5 }; IEnumerable list1 = mylist; list1.ToList().Add(1); // why 1 does not get
我在 UI 表单中的每一行之后将以下内容添加到 HashMap 集合中 声明 Map> map = new HashMap>(); List valSetOne = new ArrayList();
我正在开发我的第一个 Java 项目,我有一个问题。问题应该很简单(虽然代码不是那么短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“Character”。在
我正在开发一款应用程序,可以为用户收集推文、Facebook 状态和 Facebook 照片。目前,用户确切地设定了他们希望这种收获发生的时间和时间,并且蜘蛛会在此期间拉取数据。 when 和 to
有谁知道在 C# 中是否有与 Java 的 Set 集合等效的好方法?我知道您可以通过填充但忽略值来使用 Dictionary 或 HashTable 在某种程度上模仿集合,但这不是一种非常优雅的方式
EXISTS 该函数返回 集合中第一个元素的索引,如果集合为空,返回NULLNULLNULL Collecti
RDF集合是通过属性 rdf:parseType="Collection" 来描述仅包含指定成员的组 rdf:parseType="Collection" 属
我是一名优秀的程序员,十分优秀!