我正在尝试显示链表中流派类型的流派列表。我做了:
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);
}
}
此代码输出两次科幻和一次戏剧。我想让它只显示一次科幻。我想使用计数器和if
/else
语句,但我迷路了。
因为您要求没有流的版本,尽管我无法想象为什么:
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);
}
就个人而言,我仍然会选择流解决方案。
您可以使用 Java 流:
booksAvailable.stream().map(Book::getGenre).distinct().forEach(System.out::println)
假设您的Genre
类中有一个equals
方法,否则它无法确定流派的不同大小写。