如何从列表中获得独特的元素?

时间:2019-04-21 09:37:14

标签: java linked-list

下面是我拥有的图书清单,并通过LinkedList存储。我可以使用它们的方法使用titleyearprice和{来获取genresgetTitle()getYear()getPrice() {1}}。

我在检索getGenres()titlesyears方面没有任何问题,但是我应该得到的price必须与众不同,即在我拥有的书单中genresProgrammingProgrammingProgrammingDrama

当我使用下面的函数时,我确实获得了所有应该只获得一次Thriller的流派。

Programming

我得到的输出为:

LinkedList<Book> books = new LinkedList<Book>();

books.add(new Book("Java",2000,"Programming", "$20"));
books.add(new Book("Swift",2001,"Programming", "$30"));
books.add(new Book("C#",1990,"Programming", "$40"));
books.add(new Book("The Alchemist",2010,"Drama", "$10"));
books.add(new Book("Goosebumps",2010,"Thriller", "$5"));

private void getGenres(){
     for (Genre genre : booksList){
            System.out.println(genre.toString());
}
}

但是我应该得到的输出是:

Programming
Programming
Programming
Drama
Thriller

Help from you guys.

我希望你能理解你们。

谢谢。

3 个答案:

答案 0 :(得分:1)

对于Java 8及更高版本,您可以使用流从图书中过滤流派,然后获得不同的值:

LinkedList<Book> books = ...;

private void getGenres(){
     List<Genre> genres = books.stream()
             .map(x -> x.getGenre())
             .distinct()
             .collect(Collectors.toList());
     for (Genre genre : genres){
            System.out.println(genre);
     }
}

您的类型Genre需要实现Comparable<T>接口:

public class Genre implements Comparable<Genre>{

    String name;

    public Genre(String name) {
        super();
        this.name = name;
    }

    @Override
    public int compareTo(Genre otherGenre) {
        return name.compareTo(otherGenre.name);
    }

    @Override
    public String toString() {
        return name;
    }

}

答案 1 :(得分:1)

我正在向您更清楚地编写米哈尔代码。

public static void main(String[] args) {
    LinkedList<Book> books = new LinkedList<Book>();

    books.add(new Book("Java", 2000, "Programming", "$20"));
    books.add(new Book("Swift", 2001, "Programming", "$30"));
    books.add(new Book("C#", 1990, "Programming", "$40"));
    books.add(new Book("The Alchemist", 2010, "Drama", "$10"));
    books.add(new Book("Goosebumps", 2010, "Thriller", "$5"));
    getGenres(books);
}

private static void getGenres(LinkedList<Book> booksList) {
    List<String> collect = booksList.stream().map(x -> x.getGenres()).distinct().collect(Collectors.toList());
    collect.stream().forEach(System.out::println);
}

答案 2 :(得分:0)

这可能会使解决方案变得过于复杂,但是一种方法可以是将值添加到集合中以确保它包含不同的流派,然后再打印集合的内容。

像这样修改getGenre()方法

private void getGenres(){
  Set<String> genreSet = new HashSet<>();
  for (Genre genre : booksList){
    genreSet.add(genre.toString());
  }
  System.out.println(Arrays.asList(genreSet.toArray()));
}
相关问题