简体   繁体   中英

How to Determine Frequency of String Array List Elements Using Classes in Java

For a Java code, I have a class Called Animal where I have variables + their getters and setters such as name and age. The main method (in the Launcher class) allows the user to "Drop Off" an animal using the addAnimal method and allows the user to "Pick Up" an animal using the removeAnimal method. There are three animals to utilize, where each of them has their own class: Dog, Cat, and Bird. I want to be able to count the frequency of each animal and display it as an option: "Display Frequency" which would display the frequency of each animal whether they have been "Dropped Off" or not.

I have used the static frequency-method in Collections Collections.frequency() . I found this from Stack Overflow and figured it would work. However, every time I add a Dog, Cat, or Bird, the frequency stays as zero. I have also tried using Map<Animal, Long> counts = animals.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting())); which also did not provide the output I was expecting. It output something like this: Frequency of type 2 is {Cat@27d6c5e0=1, Bird@4f3f5b24=1} where type 2 is Cat (option 2 in which animal I`d like to "drop off").

Down below is my code for where I show the frequency. I don t really have a method for this, and I m not sure whether that would be more convenient.

 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 

What I expect my program to do is that when I choose the option to display the frequency of each animal (let`s say this would be option 3), I would like it to output "The frequency of type Dog (type 1) is 3 because there are three Dogs" and something very similar for Cat (type 2) and Bird (type 3). Is there a simplistic way to do this? I am coding on Java Eclipse.

Here the problem is each time you call the function

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

Collections.frequency checks the animals for the newly created Object instance which is unique. Therefore, it will return 0. For a simple solution you can define an equals method for your Animal class or create another ArrayList such as

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

from which you can extract the frequency of the specific type(1,2 or 3) using Collections.frequency()

(Don't have enough reputation pts to comment, so adding as an answer)

Have you overriden the "equals" method in Animal ? Otherwise, Collections.frequency() would always be zero since you are passing a new instance of Animal every time to find the frequency (using the object reference in the default equals method).

I think equals and hashcode could not help in this situation, because this methods looks identity of entities. You couldn't choose all dogs using it. I think you need to use something like animals.stream().collect(Collectors.groupingBy(Animal::getClass, Collectors.counting())) , but this bad solution (reflection not good). Instead of class you could use numbers, enums and so on

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM