簡體   English   中英

對象的 Java Arraylist 包含/等於

[英]Java Arraylist of objects Contains/equals

我查看了很多地方,大多數 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 中的 name 上編寫一個 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 的普通構造函數沒有那么簡單,並且涉及數據庫查找(那么貴)。

這意味着在這種情況下仍然可以使用 name only 構造函數,但是我需要構造 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 沒有 String 簽名,並且將其放入內聯與創建​​新類的工作量幾乎相同。

也許你可以使用Map<String,Author>作為name-> Author映射,這可以解決它

如果您使用的是真實數據,那么名稱是一個糟糕的選擇。 您認為有幾本約翰·史密斯寫書?

您需要一個唯一的標識符,並且自然數據不會削減它,因此,人工id字段是最佳選擇。

接下來,您應該重寫equals()以使用id。 hashCode()應基於equals()使用的相同字段,因此也應相應地覆蓋該字段。

接下來,使用集合而不是列表-集合保持其元素的不相等性。 無需檢查。

不久前,我在某種程度上也遇到過類似的情況,我遇到了這樣的問題:

  1. 為每個作者分配一個ID(或任何唯一標識符)。 畢竟,按名稱搜索很費時間
  2. 將所有數據加載到HashMap<Long, Author> :因為檢查HashMap包含所有Authors速度比每次檢查數據庫都要快。
  3. 在O(1)中,您可以通過hashMap.get(ID)訪問所需的Author對象

要解決這個問題,如何:

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);
  }
}

使用Object類而不是Author更改equals方法的簽名,以便Arraylist.contains方法將能夠使用它。 但是,您將不得不強制轉換對象以進行必要的比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM