2013-02-14 55 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