Vous trouverez ci-dessous la liste de livres que j'ai et qui est stockée via Je n'ai aucun problème concernant la récupération des Lorsque j'utilise la fonction ci-dessous, j'obtiens tous les genres que je devrais obtenir une seule fois J'obtiens la sortie comme: Mais la sortie que je devrais obtenir est: J'espère que vous comprenez les gars. Merci d'avance. LinkedList
. Je peux obtenir le titre
, année
, prix
et genres
par leurs méthodes en utilisant getTitle () ,
getYear ()
, getPrice ()
et getGenres ()
. 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
. Programmation
. Programming
Drama
Thriller
Programming
Programming
Programming
Drama
Thriller
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());
}
}
3 Réponses :
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); } }
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 .
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); }
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
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())); }
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 êtrenouveau livre (..)
? Une telle classeBook
devrait simplement avoirpublic 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é.