如何使用Java中的类确定字符串数组列表元素的频率

时间:2019-01-14 22:26:39

标签: java class object arraylist frequency

对于Java代码,我有一个叫做Animal的类,其中有变量+其getter和setter(例如名称和年龄)。 main方法(在Launcher类中)允许用户使用addAnimal方法“放下”动物,并允许用户使用removeAnimal方法“拾起”动物。有三种动物可以利用,每种动物都有各自的类别:狗,猫和鸟。我希望能够计算每只动物的频率并将其显示为一个选项:“显示频率”,它将显示每只动物的频率,无论它们是否已“掉落”。

我在集合Collections.frequency()中使用了静态频率方法。我从Stack Overflow找到了这个,并认为它可以工作。但是,每次添加狗,猫或鸟时,频率都保持为零。我也尝试过使用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是猫(选项2,我希望动物“下车”)。

下面是显示频率的代码。我不确定t really have a method for this, and I是否会更方便。

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 :(得分:2)

这里的问题是每次调用该函数

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

Collections.frequency检查唯一创建的Object实例的动物。因此,它将返回0。对于一个简单的解决方案,您可以为Animal类定义等于方法或创建另一个ArrayList,例如

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

您可以使用 Collections.frequency()

从中提取特定类型(1,2或3)的频率

答案 1 :(得分:1)

(没有足够的声誉分数来发表评论,因此添加为答案)

您是否已覆盖Animal中的“等于”方法? 否则,Collections.frequency()将始终为零,因为您每次都传递new的{​​{1}}实例以查找频率(使用默认Animal方法中的对象引用)。

答案 2 :(得分:1)

我认为equalshashcode在这种情况下无济于事,因为此方法看起来是实体的标识。您不能选择所有使用它的狗。我认为您需要使用类似animals.stream().collect(Collectors.groupingBy(Animal::getClass, Collectors.counting()))的方法,但是这种解决方案不好(反射效果不好)。可以使用数字,枚举等代替类,