2013-04-06 77 views
0

我已經看了很多地方,大多數數組列表示例使用「String」作爲它們的元素,但使用對象的地方很難找到。對象的Java Arraylist包含/等於

比方說,我在一本書收集工作,我有一個作家對象:

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。我可以寫一個等於上作者姓名方法(如上圖所示),然後做一些事情,如:

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的正常構造函數並不那麼簡單,並且涉及數據庫查找(如此昂貴)。

這意味着在這種情況下名稱唯一的構造函數仍然可以使用,但是然後我需要構造兩次作者。我能想到的唯一的另一種方式是創建一個從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++; 
} 

當然包含和的indexOf沒有特徵碼,並把內聯是幾乎相同的工作量,創建新的類,但。

回答

1

Mybe您可以使用Map<String,Author>的名稱 - >作者映射,這樣會得到它周圍

+0

喜歡Author對象你是在暗示並行地圖存儲或更換名單?據我所知,如果後者我只能爲作者提取一個Collection對象。 – user1720253 2013-04-06 15:54:44

0

如果你使用真實世界的數據,名字是一個可怕的選擇。你認爲有多少約翰史密斯寫書?

你需要一個唯一的標識符,自然數據不會削減它,所以人工ID字段是最好的選擇。

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

接下來,使用Set而不是List - 設置維護其元素的不相等。不需要檢查。

+0

謝謝,但在我的書集(超過3000本書)中,我沒有重複作者。儘管如此,查找仍然是一個問題。至於set vs list,我仍然需要知道它是否存在,以查看是否需要添加或更改數據,所以我不認爲這是相關的。 – user1720253 2013-04-06 15:48:26

0

我有,在一定程度上,類似的情況在不久前,我就過來了這樣的問題:

  1. 分配一個ID,每個作者(或任何唯一標識符)。 搜索的名字是時候所有
  2. 負載消耗後,所有的數據爲HashMap<Long, Author>:因爲它更快檢查HashMap與所有在它的Authors的,不是每次檢查數據庫。
  3. 在O(1)你可以訪問你的hashMap.get(ID)
+0

將數據放入(哈希)映射中會丟失列表的順序,但否則這是可行的。如果訪問是O(1),如果密鑰是Long還是String,它真的很重要嗎? – user1720253 2013-04-06 16:02:35

+0

一切都有其優點和缺點。不,不管你使用'Long'還是'String'作爲地圖的關鍵。 – 2013-04-07 03:59:56