Поскольку вы запросили версию без потоков, хотя я не могу себе представить, почему:
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);
}
Я бы лично выбрал потоковое решение.