2016-07-06 2 views
4

을 다른 책에없는 Collection에있는 모든 책 중 하나로 만들려고합니다. 내 문제는 책 ID를 기반으로 비교해야하기 때문에 첫 번째 책이 두 번째 책에 포함되어 있는지 여부를 확인하기 위해 테스트 할 수 없으며 두 번째 모음집에있는 책과 동일한 ID가 있는지 여부를 확인해야합니다. 첫 번째 책. 내가 객체 자신을 비교하고 있기 때문에Java 8의 두 컬렉션의 차이점을 찾으십니까?

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

이 코드가 제대로 작동하지 않습니다

는 내가 첫 컬렉션을 책의 두 컬렉션을 비교하고 필터링하는 아래의 코드가 있습니다. 나는 전체 book 객체 대신에 bookId에 기반한 객체들을 비교할 필요가있다. 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), Why not List가 나를 좋아하니? 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에서 작동합니다. 먼저 먼저 이전 목록의 모든 항목을 제거하려고 시도합니다 (복사 된 후 목록에서). 남은 것은 추가 된 요소입니다. 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