对象的Java Arraylist包含/等于

对象的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

我看了很多地方,大多数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;
  }
}
我相信这是可行的,我发现创建大量对象只是为了在比较后将它们扔掉是不可取的,但我遇到的问题是,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()
使用的相同字段,因此也相应地重写该字段


接下来,使用集合,而不是列表-集合保持其元素的不相等。无需检查。!

我不久前也遇到过类似的情况,我遇到了如下问题:

  • 为每个作者分配一个ID(或任何唯一标识符)。按名称搜索毕竟很耗时
  • 将所有数据加载到
    HashMap
    :因为检查包含所有
    作者的
    HashMap
    比每次检查数据库更快
  • 在O(1)中,您可以通过
    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++;
    }