2
votes

Comment obtenir un élément distinct d'une liste?

Vous trouverez ci-dessous la liste de livres que j'ai et qui est stockée via LinkedList . Je peux obtenir le titre , année , prix et genres par leurs méthodes en utilisant getTitle () , getYear () , getPrice () et getGenres () .

Je n'ai aucun problème concernant la récupération des titres , années et prix mais les genres devrais-je Je reçois doit être distinct, c'est-à-dire que dans la liste de livres j'ai Programmation , Programmation , Programmation , Drame , Thriller .

Lorsque j'utilise la fonction ci-dessous, j'obtiens tous les genres que je devrais obtenir une seule fois Programmation .

Programming
Drama
Thriller

J'obtiens la sortie comme:

Programming
Programming
Programming
Drama
Thriller

Mais la sortie que je devrais obtenir est:

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

 Aide de votre part .

J'espère que vous comprenez les gars.

Merci d'avance.


5 commentaires

La méthode standard serait d'utiliser un Set pour collecter les genres.


Double-possible de Rendre une liste liée unique


Tous vos genres semblent différents. C'est leur représentation sous forme de chaîne que vous semblez vouloir dédupliquer.


Le nouveau genre (..) ne devrait-il pas être nouveau livre (..) ? Une telle classe Book devrait simplement avoir public String getGenre () {return genre; } . Avec un tel réglage, votre code pourrait ressembler à List list = books.stream (). Map (Book :: getGenre) .distinct (). Collect (Collec‌ tors.toList ()) .


@Pshemo désolé pour la faute de frappe. C'est maintenant corrigé.


3 Réponses :


1
votes

Pour java 8 et plus récent, vous pouvez utiliser des flux pour filtrer les genres des livres, puis obtenir des valeurs distinctes:

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;
    }

}

Votre type Genre doit implémenter Interface comparable:

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);
     }
}


10 commentaires

Pouvez-vous poster ici votre code complet? Cela fonctionne pour moi, donc je suppose qu'il y aura un problème en dehors de cette méthode.


Même sortie à chaque fois. :(


Une chose qui pourrait prêter à confusion, @PramishLuitel devrait spécifier de quelle classe fait partie la méthode getGenres () et si elle est statique ou non.


@MichalHorvath Je ne peux pas utiliser de statique, donc c'est une fonction non statique.


@PramishLuitel J'ai édité ma réponse pour vous montrer mon code complet utilisé pour les tests.


@MichalHorvath J'ai édité ma question et ajouté l'image de code et cela ne fonctionne pas pour moi de toute façon. Je ne sais pas pourquoi cela ne fonctionne pas. Le reste du code est similaire à ce que vous m'avez donné. Mais il ne montre que les cinq genres.


@PramishLuitel Je vois où est le problème. Le genre de votre propriété est de type Genre et non de String . Afin de filtrer les valeurs distinctes, votre classe Genre doit implémenter l'interface Comparable . J'écrirai quelque chose et modifierai ma réponse dans 5 min.


@MichalHorvath Got it mate et merci beaucoup pour votre aide. Mon ami vraiment vraiment apprécié.


@PramishLuitel heureux d'avoir pu aider


@MichalHorvath Vraiment très apprécié pour votre aide. J'ai encore une autre question. Pourriez-vous m'aider là-dessus, s'il vous plaît? Le lien vers la question est stackoverflow.com/questions/55797255 / i-cant-access-genre-cla‌ ss .



1
votes

Je vous écris plus clairement le code Michal.

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 commentaires

Ouais, ça me montre tous les genres de ma sortie.


bonne réponse, juste getGenres () devrait être défini comme non statique comme @PramishLuitel l'a écrit dans les commentaires



0
votes

Cela complique peut-être trop la solution, mais une façon peut être d'ajouter les valeurs à un ensemble pour s'assurer qu'il contient des genres distincts, puis d'imprimer plus tard le contenu de l'ensemble.

Modifiez la méthode getGenre () comme ceci

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


0 commentaires