Java管道和过滤器模式问题

时间:2014-05-26 09:12:37

标签: java object

我有List<Animals>

public class Animals{
    int legs; 
    int age;
    int eyes;
//getters , setters 
}

我想在列表中以任意组合执行不同的操作。例如。计算均值,计算中位数,计算两个字段的中间值等。

在我想根据medianAnimal legs的中间值计算Animal age的特定情况下,这是如何完成的?

我首先要通过arraylist和peform(leg + age)/ 2循环来获得中间值。然后我将这些值提供给下一个计算平均值的操作。所以我的问题是,我在哪里存储在第一个操作中执行的数据,以便将它传递给第二个?是否可以动态扩展Animal对象以包含新字段?我以为我可以创建一个临时数组并存储结果,但之后我会丢失有关动物的信息,也没有映射。

(我知道如何计算均值/中位数等等,只是想知道如何正确处理这个问题来解析数据)

3 个答案:

答案 0 :(得分:0)

您可以为仅在Animals字段上工作的方法扩展Animals来计算动物的中间值(亲:您的操作有一个有意义的名称。禁忌:您的班级规模增长)或创建({临时)Map<Animals, Double> Animals到中间值并随后遍历地图以计算平均值(亲:你的班级不会增长,反对:你有一个有意义的操作名称。)

答案 1 :(得分:0)

通常,您将数据存储在容器中,而不是添加到现有类中。如果你有充分的理由,你只想打破这个规则。

让我们来看看一些容器:

  • List<Animal>:只是一个列表,您无法向其添加任何额外信息
  • Map<Animal, X>:将Animal映射到特定数据类型的映射。这里X可以是直接值,例如Double(请注意,它必须是对象,而不是基元),或者是可以存储多个数据字段的自定义类。
  • Map<Animal, List<X>>:将Animal映射到特定数据类型列表的地图。

这些是最重要的数据类型,它们通常会在ArrayListHashMap时提供出色的效果。

答案 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]