对象的Java Arraylist包含/等于
我已经看了很多地方,大多数数组列表示例使用“String”作为它们的元素,但使用对象的地方很难找到。对象的Java Arraylist包含/等于
比方说,我在一本书收集工作,我有一个作家对象:
class Author {
String name;
<other data>;
int bookCount;
public Author(String n) {
name = n;
}
public boolean equals(Author other) {
if (other.name.equals(name)) { return true;}
return false;
}
}
所以我创建实例作为ArrayList作者列表:
Arraylist<Author> writers;
所以我想找出作者是否存在,如果他们不存在或创建一个新条目,或者如果他们这样做,则增加bookCount。我可以写一个等于上作者姓名方法(如上图所示),然后做一些事情,如:
bookAuthor = "James Gosling"; // normally an input
Author current = new Author(bookAuthor);
if (!writers.contains(current)) {
writers.add(current);
} else {
writers.get(writers.indexOf(current)).bookCount++;
}
我相信这会工作,我觉得很反感的是刚刚创造了大量的对象在比较之后将它们扔掉,但是我遇到的问题是Author的正常构造函数并不那么简单,并且涉及数据库查找(如此昂贵)。
这意味着在这种情况下名称唯一的构造函数仍然可以使用,但是然后我需要构造两次作者。我能想到的唯一的另一种方式是创建一个从ArrayList继承并重写Contains和indexOf的新类。这似乎是一个很大的开销,然后我是否需要重写equals或hashCode或新类中的其他东西?
我是否错过了一些东西,有没有提供内联函数或使某些东西容易使用对象容器的方法? 我希望,人们可以这样做:
Arraylist<Author> {equals(String x) { if (x = this.name) { return true;} return false; } writers;
if (!writers.contains(bookAuthor)) {
writers.add(new Author(bookAuthor,dbconn);
} else {
writers.get(writers.indexOf(bookAuthor)).bookCount++;
}
当然包含和的indexOf没有特征码,并把内联是几乎相同的工作量,创建新的类,但。
Mybe您可以使用Map<String,Author>
的名称 - >作者映射,这样会得到它周围
如果你使用真实世界的数据,名字是一个可怕的选择。你认为有多少约翰史密斯写书?
你需要一个唯一的标识符,自然数据不会削减它,所以人工ID字段是最好的选择。
接下来,您应该覆盖equals()
以使用ID。 hashCode()
应基于equals()
使用的相同字段,因此也应相应地覆盖该字段。
接下来,使用Set而不是List - 设置维护其元素的不相等。不需要检查。
谢谢,但在我的书集(超过3000本书)中,我没有重复作者。尽管如此,查找仍然是一个问题。至于set vs list,我仍然需要知道它是否存在,以查看是否需要添加或更改数据,所以我不认为这是相关的。 – user1720253 2013-04-06 15:48:26
我有,在一定程度上,类似的情况在不久前,我就过来了这样的问题:
- 分配一个ID,每个作者(或任何唯一标识符)。 搜索的名字是时候所有
- 负载消耗后,所有的数据为
HashMap<Long, Author>
:因为它更快检查HashMap
与所有在它的Authors
的,不是每次检查数据库。 - 在O(1)你可以访问你的
hashMap.get(ID)
将数据放入(哈希)映射中会丢失列表的顺序,但否则这是可行的。如果访问是O(1),如果密钥是Long还是String,它真的很重要吗? – user1720253 2013-04-06 16:02:35
一切都有其优点和缺点。不,不管你使用'Long'还是'String'作为地图的关键。 – 2013-04-07 03:59:56
喜欢
Author
对象你是在暗示并行地图存储或更换名单?据我所知,如果后者我只能为作者提取一个Collection对象。 – user1720253 2013-04-06 15:54:44