对象的Java Arraylist包含/等于
我看了很多地方,大多数arraylist示例都使用“String”作为元素,但是使用对象的地方很难找到 假设我正在收集一本书,我有一个作者对象:对象的Java Arraylist包含/等于,java,object,arraylist,containers,Java,Object,Arraylist,Containers,我看了很多地方,大多数arraylist示例都使用“String”作为元素,但是使用对象的地方很难找到 假设我正在收集一本书,我有一个作者对象: class Author { String name; <other data>; int bookCount; public Author(String n) { name = n; } public boolean equals(Author other) { if (other.name
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;
}
}
我相信这是可行的,我发现创建大量对象只是为了在比较后将它们扔掉是不可取的,但我遇到的问题是,Author的普通构造函数并不是那么简单,而且涉及数据库查找(非常昂贵)
这意味着在本例中仍然可以使用仅名称的构造函数,但是我需要构造两次作者。我能想到的唯一其他方法是创建一个从ArrayList继承的新类,并重写Contains和indexOf。这看起来是一个很大的开销,那么我是否也需要在新类中重写equals、hashCode或其他内容
我是否遗漏了一些东西,是否有一些方法可以提供内联函数或使对象容器的使用更加简单?
我希望有人能做一些类似的事情:
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++;
}
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++;
}
Arraylist{equals(String x){if(x=this.name){return true;}return false;}writers;
如果(!writers.contains(bookAuthor)){
添加(新作者(bookAuthor,dbconn);
}否则{
writers.get(writers.indexOf(bookAuthor)).bookCount++;
}
当然,contains和indexOf没有字符串签名,将其内联与创建新类的工作量几乎相同。Mybe您可以使用
Map
进行名称->作者映射,这将解决问题。如果您使用的是真实世界的数据,名称是一个糟糕的选择。您认为有多少John Smith这些是写书的人吗
您需要一个唯一的标识符,而自然数据不会切割它,因此人工id字段是最佳选择
接下来,您应该重写equals()
以使用id。hashCode()
应该基于equals()
使用的相同字段,因此也相应地重写该字段
接下来,使用集合,而不是列表-集合保持其元素的不相等。无需检查。!我不久前也遇到过类似的情况,我遇到了如下问题:
HashMap
:因为检查包含所有作者的HashMap
比每次检查数据库更快
hashMap.get(ID)
谢谢,但在我的藏书中(超过3000本)我没有重复的作者。但这是查找的一个问题。至于set vs list,我仍然需要知道它是否存在,以查看是否需要添加或更改数据,因此我不认为这是相关的。您是否建议使用并行映射存储或替换列表?如果是后者,我只能为作者提取一个集合对象作为fa如我所知。将数据放入(散列)映射会丢失列表的顺序,但在其他情况下,这是可行的。如果访问权限为O(1),则键是长键还是字符串真的很重要吗?每件事都有其优缺点。不,使用
Long
或String
作为映射键没有区别。
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++;
}