2016-07-06 9 views
4

を1つにまとめてCollectionの本の中には存在しないようにしようとしています。私の問題は、ブックIDに基づいて比較する必要があるため、最初のブックが2番目のブックに含まれているかどうかを確認するだけでは不十分で、2番目のコレクションのブックが最初の本。Java 8の2つのコレクションの違いを見つけるには?

私は本の2つのコレクションを比較し、最初のコレクションをフィルタリングするには、以下のコードを持っている:私は、オブジェクト自体を比較していますので、

List<Book> parentBooks = listOfBooks1.stream().filter(book-> 
    !listOfBooks2.contains(book)).collect(Collectors.toList()); 

コードが正しく動作しません。ブックオブジェクト全体の代わりにブックIDに基づいてオブジェクトを比較する必要があります。 bookId(book.getId())に基づいて比較を実行できるように、コードをどのように変更する必要がありますか?

答えて

10
List<Book> books1 = ...; 
List<Book> books2 = ...; 
Set<Integer> ids = books2.stream() 
     .map(Book::getId) 
     .collect(Collectors.toSet()); 
List<Book> parentBooks = books1.stream() 
     .filter(book -> !ids.contains(book.getId())) 
     .collect(Collectors.toList()); 
+0

ありがとうございます。出来た。 – Nisman

+0

うわーの仕事 – user2244734

+0

なぜ誰かがSet(ids)、どうしてリストじゃないの?これは、Setの "contains"演算にはO(1)が必要なためです。 –

0
boolean test = book1.stream().allMatch(t->book2.contains(t)); 
-1
Set<Integer> books1ids = listOfBooks1.stream().map(Book::getId).collect(Collectors.toSet()); 
Set<Integer> books2ids = listOfBooks2.stream().map(Book::getId).collect(Collectors.toSet()); 
return books1ids.equals(books2ids); 
0

問題は複雑ですが、それはあなたのデータを知って、一つのことに帰着します。 imutables、idを持つエンティティ、重複したエントリなどですか?以下のコードは、値だけを持つimmutables(重複している可能性がある)に対しても機能します。まず、beforeリストのすべてのエントリを削除しようとします(コピーされたafterリストから)。残されたのは、追加された要素です。 after-listから削除できるbefore-listのものは変更されていないものです。残りは削除されたものです

package scrap; 

import java.util.ArrayList; 
import java.util.List; 

public class ListDiffer<T> { 

    private List<T> addedList = new ArrayList<>(); 
    private List<T> unchangedList = new ArrayList<>(); 
    private List<T> removedList = new ArrayList<>(); 

    public ListDiffer(List<T> beforeList, List<T> afterList) { 
     addedList.addAll(afterList); // Will contain only new elements when all elements in the Before-list are removed. 
     beforeList.forEach(e -> { 
      boolean b = addedList.remove(e) ? unchangedList.add(e) : removedList.add(e); 
     }); 
    } 

    public List<T> getAddedList() { 
     return addedList; 
    } 

    public List<T> getUnchangedList() { 
     return unchangedList; 
    } 

    public List<T> getRemovedList() { 
     return removedList; 
    } 
} 
+0

コードのみの回答は、将来の読者のために多くの情報を提供しないので奨励されていません – WhatsThePoint

+0

答えにその説明を編集できますか? – WhatsThePoint

関連する問題