1

想法:

我有一个对象

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本书。

问候,

4

2 回答 2

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()你只需要名字一样。

于 2013-02-14T10:33:39.413 回答
1

为书名集合使用一个Set (如HashSet),这样你就不必每次都检查你是否已经有了当前的书名。您可以在恒定时间内将元素插入 HashSet,并且不会有重复项。确保你有一个好的 hashCode() 方法和一个对应的 equals,请参阅:Java 中覆盖 equals 和 hashCode 时应该考虑哪些问题?

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

于 2013-02-14T09:41:03.973 回答