Как получить отдельный элемент из списка? - PullRequest
2 голосов
/ 21 апреля 2019

Ниже приведен список книг, который у меня есть и хранится через LinkedList. Я могу получить title, year, price и genres их методами, используя getTitle(), getYear(), getPrice() и getGenres().

У меня нет проблем с извлечением titles, years и price, но значение genres, которое я получаю, должно быть отличным, т. Е. В списке книг, который у меня есть Programming, Programming, Programming, Drama, 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

Но вывод, который я должен получить:

Programming
Drama
Thriller

Help from you guys.

Надеюсь, вы понимаете, ребята.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 21 апреля 2019

Я пишу Михал код более четко для вас.

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);
}
1 голос
/ 21 апреля 2019

Для 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;
    }

}
0 голосов
/ 21 апреля 2019

Решение может быть слишком сложным, но одним из способов может быть добавление значений к набору, чтобы убедиться, что он содержит различные жанры, и последующая печать содержимого набора.

Изменение метода getGenre ()как это

private void getGenres(){
  Set<String> genreSet = new HashSet<>();
  for (Genre genre : booksList){
    genreSet.add(genre.toString());
  }
  System.out.println(Arrays.asList(genreSet.toArray()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...