我正在尝试显示链接列表中我所拥有的流派类型的流派列表。我做了:
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
语句,但我迷路了。
答案 0 :(得分:1)
您可以使用Java流:
booksAvailable.stream().map(Book::getGenre).distinct().forEach(System.out::println)
假设您的equals
课程中有Genre
方法,否则无法确定某种类型的不同情况。
答案 1 :(得分: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);
}
我个人仍然会选择流解决方案。