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