2013-02-14 53 views
1

對象的列表獲得的變量列表的想法:番石榴:從包含可變

我有一個對象

public class Book(){ 
    private String name; 
    private Integer nbOfPage; 
    public Book() 
    ... 
} 

而且我得到了這個對象的列表

List<Book> books = new ArrayList<Book>(); 

現在我在想,如果番石榴或其他LIBRAIRIE,有一個快速的方法來從我得到的所有書籍得到的所有不同名稱的列表,這是我可以做的:

List<String> names = new ArrayList<String>(); 
for (Book aBook : books){ 
    if (!names.contains(aBook.getName()){ 
     names.add(aBook.getName()); 
    } 
} 

我覺得這種方式有點「重」,我的書列表可以有200至1200的書籍。

問候,

+1

這有什麼問題? – Martin 2013-02-14 09:33:17

回答

1

使用Set(如HashSet的),這本書的名字集合,這樣你就不必檢查每個時間是否已經擁有了當前圖書的名稱。您可以將元素在常量時間內插入到HashSet中,並且不會有重複項。確保你有一個很好的hashCode()方法和一個相應的等於,看到這個:What issues should be considered when overriding equals and hashCode in Java?

更快的解決方案不存在,因爲你必須遍歷所有的書至少一次。

+0

是的,這是第一個好的改進,我同意。 – user2071406 2013-02-14 09:44:33

+0

那麼,恕我直言,這不是一個「先做好改善」,但你能做的一切。你不能比這更快... – lbalazscs 2013-02-14 09:54:26

2

利用番石榴的Multimaps.index。它的確如你所期望的那樣。

List<Book> books = ... 

Function<Book,String> bookToName = new Function<Book,String>() { 
    String apply(Book b) { return b.getName(); } 
} 

Multimap<String,Book> booksByName = Multimaps.index(books, bookToName); 

然後,玩弄你的Multimap,像booksByName.keys()如果你只需要姓名。

+1

嗯...我承認我無法正確讀取的問題。雖然這回答了,但更好的解決方案是使用'Iterables.transform()' – 2013-02-14 10:48:06