1

我看过很多地方,大多数 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。我可以在 Author 中的名称上写一个 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 并覆盖包含和 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 没有 String 签名,并且将其内联几乎与创建新类的工作量相同。

4

4 回答 4

1

Mybe,您可以将Map<String,Author>其用于名称->作者映射,这将解决它

于 2013-04-06T07:29:47.820 回答
0

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

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

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

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

于 2013-04-06T11:03:20.380 回答
0

在某种程度上,我前段时间也遇到过类似的情况,我遇到了这样的问题:

  1. 为每个作者分配一个 ID(或任何唯一标识符)。毕竟按名字搜索很费时间
  2. 将所有数据加载到HashMap<Long, Author>: 因为检查其中的HashMap所有Authors数据比每次检查数据库要快。
  3. 在 O(1) 中,您可以通过以下方式访问Author您喜欢的对象hashMap.get(ID)
于 2013-04-06T11:34:17.300 回答
0

要解决这个问题,如何:

class Author {
  String name;
  <other data>;
  int bookCount;

  public Author(String n) {
     name = n;
  }

  @Override
  public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null) return false;
     if (this.getClass() != o.getClass()) return false;
     Author other = (Author) o;
     return other.name.equals(name);
  }
}

equals使用Object类而不是方法更改方法的签名,Author以便该Arraylist.contains方法能够使用它。但是随后您将不得不强制转换对象以进行必要的比较。

于 2021-11-08T05:38:53.243 回答