Как определить частоту элементов списка строковых массивов, используя классы в Java - PullRequest
0 голосов
/ 15 января 2019

Для кода Java у меня есть класс Called Animal, где у меня есть переменные + их методы получения и установки, такие как имя и возраст. Основной метод (в классе Launcher) позволяет пользователю «удалить» животное с помощью метода addAnimal и позволяет пользователю «забрать» животное с помощью метода removeAnimal. Есть три животных для использования, где у каждого из них есть свой класс: собака, кошка и птица. Я хочу иметь возможность подсчитывать частоту каждого животного и отображать ее в качестве опции: «Частота отображения», которая отображала бы частоту каждого животного, независимо от того, было ли оно «сброшено» или нет.

Я использовал статический частотный метод в Коллекциях Collections.frequency(). Я нашел это в Stack Overflow и решил, что это сработает. Тем не менее, каждый раз, когда я добавляю Dog, Cat или Bird, частота остается равной нулю. Я также попытался использовать Map<Animal, Long> counts = animals.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()));, который также не дал ожидаемого результата. Он выводит что-то вроде этого: Frequency of type 2 is {Cat@27d6c5e0=1, Bird@4f3f5b24=1}, где тип 2 - это Cat (вариант 2, в котором животное я бы хотел "высадить").

Ниже мой код для того, где я показываю частоту. Я не уверен, что это будет более удобно.

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

Я ожидаю, что моя программа будет делать то, что, когда я выбираю опцию для отображения частоты каждого животного (допустим, это будет вариант 3), я бы хотел, чтобы она вывела «Частота типа Dog (тип 1) равен 3, потому что есть три собаки »и что-то очень похожее для кошек (тип 2) и птиц (тип 3). Есть ли упрощенный способ сделать это? Я пишу на Java Eclipse.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Здесь проблема заключается в том, что каждый раз, когда вы вызываете функцию

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

Collections.frequency проверяет животных на наличие только что созданного экземпляра объекта, который является уникальным. Поэтому он вернет 0. Для простого решения вы можете определить метод равно для вашего класса Animal или создать другой ArrayList, такой как

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

, из которого вы можете извлечь частоту определенного типа (1,2 или 3), используя Collections.frequency ()

0 голосов
/ 15 января 2019

Я думаю equals и hashcode не могли бы помочь в этой ситуации, потому что этот метод выглядит идентичностью сущностей. Вы не могли выбрать всех собак, использующих это. Я думаю, что вам нужно использовать что-то вроде animals.stream().collect(Collectors.groupingBy(Animal::getClass, Collectors.counting())), но это плохое решение (отражение не хорошо). Вместо класса вы можете использовать числа, перечисления и т. Д.

0 голосов
/ 15 января 2019

(Не хватает очков репутации, чтобы комментировать, поэтому добавьте в качестве ответа)

Вы переопределили метод "равно" в Animal? В противном случае Collections.frequency() всегда будет равно нулю, поскольку вы каждый раз передаете new экземпляр Animal для поиска частоты (используя ссылку на объект в методе equals по умолчанию).

...