链表以某种数据类型显示数据



我正在尝试显示链表中流派类型的流派列表。我做了:

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方法,否则它无法确定流派的不同大小写。

相关内容

  • 没有找到相关文章