我查看了很多地方,大多数arraylist示例都使用“String”作为元素,但是使用对象的地方很难找到。
假设我正在撰写一本书籍集,并且我有一个作者对象:
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,如果他们这样做。我可以在作者的名字上写一个equals方法(如上所示)然后做类似的事情:
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的正常构造函数并不那么简单,并且涉及到数据库查找(如此昂贵)。
这意味着在这种情况下仍然可以使用仅名称构造函数,但是我需要构造两次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++;
}
但当然contains和indexOf没有字符串签名,并且将内联放入与创建新类的工作量几乎相同。
答案 0 :(得分:1)
Mybe你可以使用Map<String,Author>
作为名字 - &gt;作者映射,这将得到它
答案 1 :(得分:0)
如果你使用真实世界的数据,名字是一个糟糕的选择。你认为约翰史密斯有多少写书?
您需要一个唯一标识符,自然数据不会削减它,因此人工ID字段是最佳选择。
接下来,您应该覆盖equals()
以使用ID。 hashCode()
应该基于equals()
使用的相同字段,因此也要相应地覆盖它。
接下来,使用Set而不是List - 集维护其元素的不相等性。无需检查。!
答案 2 :(得分:0)
在某种程度上,我曾经有类似的情况,而且我遇到了这样的问题:
HashMap<Long, Author>
:因为检查HashMap
中包含所有Authors
的速度要快于每次检查数据库。Author
hashMap.get(ID)
对象
醇>