Связанный список отображает данные в виде данных - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь отобразить списки жанров в жанре, который у меня есть в связанном списке. Я сделал:

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 дважды и Drama один раз. Я хочу, чтобы он отображал SciFi только один раз. Я думал об использовании операторов counter и if / else, но я заблудился.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Поскольку вы запросили версию без потоков, хотя я не могу себе представить, почему:

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);
 }

Я бы лично выбрал потоковое решение.

0 голосов
/ 06 мая 2018

Вы можете использовать потоки Java:

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

Предполагается, что у вас есть equals метод в вашем классе Genre, иначе он не может определить отдельные случаи жанра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...