>

링크 목록에있는 장르 유형으로 장르 목록을 표시하려고합니다. 나는 :

public void outputGenre(){
    booksAvilable = new LinkedList <Book>();
    booksAvailable.add(new book("Enders Game",1999,new Genre ("SciFi"),3));
    booksAvailable.add(new book("Star Trek",1974,new Genre ("SciFi"),4));
    booksAvailable.add(new book("Game of Thrones",1991,new Genre ("Drama"),3));
    System.out.println("We have following Genres");
    for(Book books:booksAvilable()){
        Genre genre = books.getGenre();
        System.out.println(genre);
    }
}

이 코드는 SciFi를 두 번, 드라마를 한 번 출력합니다. SciFi를 한 번만 표시하고 싶습니다. 카운터와 if 를 사용할 생각 / else  성명서,하지만 길을 잃었습니다.

  • 답변 # 1

    스트림이없는버전없이버전을 요청했기 때문에 이유를 상상할 수는 없습니다 :

    Set<Genre> seen = new HashSet<>();
    for(Book books:booksAvailable() ){
       Genre genre = books.getGenre();
       if (!seen.contains(genre)) {
           System.out.println(genre);
           seen.add(genre);
       }
    }
    
    

    이 경우 이미 본 장르의 기록을 유지하고 아직 보지 않은 경우에만 표시해야합니다.

    스트리밍 변형이 더 깨끗하고 간결하다는 주장은 많이 들지 않습니다.

    여전히 equals 의 구현이 필요합니다  제대로 작동하고 HashSet 를 사용했기 때문에  또한 int hashCode() 장르 이름 문자열의 해시 코드를 반환 할 수 있습니다.

    아직 다른 형식은 장르의 이름을 세트로 기록하고 있으며 두 개의 루프가 필요합니다 :

    Set<String> genres = new HashSet<>();
    for(Book books:booksAvailable() ){
       Genre genre = books.getGenre();
       genres.add(genre.getName());
    }
     for(String genre : genres) {
           System.out.println(genre);
     }
    
    

    개인적으로 스트림 솔루션을 사용하려고합니다.

  • 답변 # 2

    자바 스트림을 사용할 수 있습니다 :

    booksAvailable.stream().map(Book::getGenre).distinct().forEach(System.out::println)
    
    

    당신이 equals 있다고 가정  당신의 Genre 의 방법  그렇지 않으면 장르의 뚜렷한 사례를 결정할 수 없습니다.

  • 이전 동일한 변수를 사용하는 Python 암호화 라이브러리 해독으로 InvalidTag 제공
  • 다음 r - 동일한 코드를 사용한 결과의 차이점