我有List<Animals>
public class Animals{
int legs;
int age;
int eyes;
//getters , setters
}
我想在列表中以任意组合执行不同的操作。例如。计算均值,计算中位数,计算两个字段的中间值等。
在我想根据median
和Animal legs
的中间值计算Animal age
的特定情况下,这是如何完成的?
我首先要通过arraylist和peform(leg + age)/ 2循环来获得中间值。然后我将这些值提供给下一个计算平均值的操作。所以我的问题是,我在哪里存储在第一个操作中执行的数据,以便将它传递给第二个?是否可以动态扩展Animal对象以包含新字段?我以为我可以创建一个临时数组并存储结果,但之后我会丢失有关动物的信息,也没有映射。
(我知道如何计算均值/中位数等等,只是想知道如何正确处理这个问题来解析数据)
答案 0 :(得分:0)
您可以为仅在Animals
字段上工作的方法扩展Animals
来计算动物的中间值(亲:您的操作有一个有意义的名称。禁忌:您的班级规模增长)或创建({临时)Map<Animals, Double>
Animals
到中间值并随后遍历地图以计算平均值(亲:你的班级不会增长,反对:你有一个有意义的操作名称。)
答案 1 :(得分:0)
通常,您将数据存储在容器中,而不是添加到现有类中。如果你有充分的理由,你只想打破这个规则。
让我们来看看一些容器:
List<Animal>
:只是一个列表,您无法向其添加任何额外信息Map<Animal, X>
:将Animal
映射到特定数据类型的映射。这里X
可以是直接值,例如Double
(请注意,它必须是对象,而不是基元),或者是可以存储多个数据字段的自定义类。Map<Animal, List<X>>
:将Animal
映射到特定数据类型列表的地图。这些是最重要的数据类型,它们通常会在ArrayList
和HashMap
时提供出色的效果。
答案 2 :(得分:0)
在Java 8中将是:
Double[] vals = animals.stream()
.map(animal -> (animal.getLegs() + animal.getAge()) / 2.0)
.sorted()
.toArray(Double[]::new);
double median = (vals.length % 2 == 0) ? (vals[vals.length / 2] + vals[vals.length / 2 - 1]) / 2: vals[vals.length / 2]