Java对象的Arraylist包含/ equals

时间:2013-04-06 07:22:27

标签: 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.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没有字符串签名,并且将内联放入与创建新类的工作量几乎相同。

3 个答案:

答案 0 :(得分:1)

Mybe你可以使用Map<String,Author>作为名字 - &gt;作者映射,这将得到它

答案 1 :(得分:0)

如果你使用真实世界的数据,名字是一个糟糕的选择。你认为约翰史密斯有多少写书?

您需要一个唯一标识符,自然数据不会削减它,因此人工ID字段是最佳选择。

接下来,您应该覆盖equals()以使用ID。 hashCode()应该基于equals()使用的相同字段,因此也要相应地覆盖它。

接下来,使用Set而不是List - 集维护其元素的不相等性。无需检查。!

答案 2 :(得分:0)

在某种程度上,我曾经有类似的情况,而且我遇到了这样的问题:

  1. 为每位作者(或任何唯一标识符)分配ID。在所有
  2. 之后,按名称搜索是非常耗时的
  3. 将所有数据加载到HashMap<Long, Author>:因为检查HashMap中包含所有Authors的速度要快于每次检查数据库。
  4. 在O(1)中,您可以通过Author
  5. 访问您喜欢的hashMap.get(ID)对象