链接列表显示数据类型中的数据

时间:2018-05-06 14:44:15

标签: java linked-list

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

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 :(得分: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);
 }

我个人仍然会选择流解决方案。