Guava:从包含变量的对象列表中获取变量列表

时间:2013-02-14 09:31:58

标签: java list guava

这个想法:

我有一个对象

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

我得到了这个对象的列表

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

现在我想知道在番石榴或其他图书馆里,有一个快速的方法可以从我得到的所有书籍中获得所有不同名字的清单,我可以做的事情:

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

我认为这种方式有点“沉重”,我的书单可以有200到1200本书。

此致

2 个答案:

答案 0 :(得分:2)

使用Guava的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 :(得分:1)

使用Set(例如HashSet)作为图书名称集合,这样您就不必每次都检查您是否已拥有当前图书名称。您可以在恒定时间内将元素插入到HashSet中,并且您将没有重复项。确保你有一个好的hashCode()方法和相应的equals,请看:What issues should be considered when overriding equals and hashCode in Java?

不存在更快的解决方案,因为您必须至少迭代一次所有书籍。