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
Setpour 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 classeBookdevrait 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é.