1
votes

Comment déterminer la fréquence des éléments de liste de tableaux de chaînes à l'aide de classes en Java

Pour un code Java, j'ai une classe Called Animal où j'ai des variables + leurs getters et setters tels que le nom et l'âge. La méthode principale (dans la classe Launcher) permet à l'utilisateur de «déposer» un animal en utilisant la méthode addAnimal et permet à l'utilisateur de «ramasser» un animal en utilisant la méthode removeAnimal. Il y a trois animaux à utiliser, chacun ayant sa propre classe: chien, chat et oiseau. Je veux pouvoir compter la fréquence de chaque animal et l'afficher en option: "Afficher la fréquence" qui afficherait la fréquence de chaque animal, qu'il ait été "déposé" ou non.

J'ai utilisé la méthode de fréquence statique dans Collections Collections.frequency () . J'ai trouvé cela sur Stack Overflow et j'ai pensé que cela fonctionnerait. Cependant, chaque fois que j'ajoute un chien, un chat ou un oiseau, la fréquence reste nulle. J'ai également essayé d'utiliser Map count = animals.stream (). Collect (Collectors.groupingBy (e -> e, Collectors.counting ())); qui n'a pas non plus fourni la sortie que j'attendais. Il affiche quelque chose comme ceci: La fréquence de type 2 est {Cat @ 27d6c5e0 = 1, Bird @ 4f3f5b24 = 1} où le type 2 est Cat (option 2 dans laquelle l'animal que j'aimerais "déposer ").

Ci-dessous se trouve mon code pour l'endroit où j'affiche la fréquence. Je n'ai pas vraiment de méthode pour cela, et je ne sais pas si ce serait plus pratique.

ArrayList<Animal> animals = new ArrayList<>();

boolean addAnimal (int type, String name, int age) {		
	//int frequency = Collections.frequency(animals, type);		
	boolean isAdded = false;		
	switch (type) {		
	    case 1:	    	
	        animals.add(new Dog(name, age));	        
	        isAdded = true;        
	        System.out.println("Frequency of " + type + ": "+ Collections.frequency(animals, (new Dog(name, age))));	        
	    case 2:	    	
	        animals.add(new Cat(name, age)); 	        
	        isAdded = true;	        
	        System.out.println("Frequency of " + type + ": "+ Collections.frequency(animals, (new Cat(name, age))));	       
	    case 3:	    	
	        animals.add(new Bird(name, age));	        
	        isAdded = true;       
	        System.out.println("Frequency of " + type + ": "+ Collections.frequency(animals, (new Bird(name, age))));        
	    default:	        
	        isAdded = false;        
	 }//end of switch
	    return isAdded;
   }//end of addAnimal(type, name, age)

// here comes the method to remove an animal...

}// end of class Database

Ce que j'attends de mon programme, c'est que lorsque je choisis l'option pour afficher la fréquence de chaque animal (disons que ce serait l'option 3), je voudrais qu'il affiche "La fréquence de le type Chien (type 1) est 3 car il y a trois chiens "et quelque chose de très similaire pour Chat (type 2) et Oiseau (type 3). Existe-t-il un moyen simpliste de le faire? Je suis en train de coder sur Java Eclipse.


3 commentaires

Avez-vous implémenté les méthodes equals () et hashCode () dans les super- et sous-classes Animal?


Vous devez remplacer la méthode equals (). Voir ceci: geeksforgeeks.org/java-util-collections-frequency-java < / a> pour référence


Merci pour le lien. Je vais certainement le vérifier.


3 Réponses :


1
votes

(Vous n'avez pas assez de points de réputation pour commenter, donc ajouter comme réponse)

Avez-vous remplacé la méthode "equals" dans Animal ? Sinon, Collections.frequency () sera toujours égal à zéro puisque vous passez une nouvelle instance de Animal à chaque fois pour trouver la fréquence (en utilisant le référence d'objet dans la méthode par défaut equals ).


1 commentaires

C'est pourquoi j'obtenais une fréquence de zéro à chaque fois. Merci d'avoir fait remarquer cela! Je vais sûrement prendre en considération ce que vous avez dit.



2
votes

Ici, le problème est à chaque fois que vous appelez la fonction

ArrayList<Integer> types =...
case 1:         
        animals.add(new Dog(name, age));            
        isAdded = true;
        types.add(1);        

Collections.frequency vérifie les animaux pour la nouvelle instance d'Objet qui est unique. Par conséquent, il renverra 0. Pour une solution simple, vous pouvez définir une méthode equals pour votre classe Animal ou créer une autre ArrayList telle que

Collections.frequency(animals, (new Dog(name, age)))

à partir de dont vous pouvez extraire la fréquence du type spécifique (1, 2 ou 3) en utilisant Collections.frequency ()


3 commentaires

Une représentation visuelle m'a toujours aidé. Merci beaucoup pour ça! Je vais l'essayer et prendre quelques notes au cas où je devrais refaire quelque chose comme ça à l'avenir.


Est-ce que j'utiliserais Collections.frequency (types, type)? Parce que cela ne fonctionne toujours pas ...


Oui, vous devrez utiliser Collections.frequency (types, type) où types est le ArrayList et type est un Integer. Vérifiez si vous ajoutez correctement les types à la liste des tableaux ou appelez la fonction frequency (), car une implémentation simple semble fonctionner pour moi.



1
votes

Je pense que est égal à et hashcode ne pourrait pas aider dans cette situation, car cette méthode ressemble à l'identité des entités. Vous ne pouviez pas choisir tous les chiens qui l'utilisaient. Je pense que vous devez utiliser quelque chose comme animals.stream (). Collect (Collectors.groupingBy (Animal :: getClass, Collectors.counting ())) , mais cette mauvaise solution (réflexion pas bonne). Au lieu de la classe, vous pouvez utiliser des nombres, des énumérations, etc.


1 commentaires

Merci pour votre suggestion. Apprécié (: