繁体   English   中英

Java管道和过滤器模式问题

[英]Java pipe and filter pattern issue

我有一个List<Animals>

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

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

在特定情况下,我想根据Animal legsAnimal age的中间值来计算中median ,该怎么做?

我首先必须循环遍历arraylist和peform(legs + age)/ 2以获取中间值。 然后,我会将这些值提供给将计算平均值的下一个操作。 所以我的问题是,在哪里存储在第一次操作中执行的数据,以便将其传递给第二次? 是否可以动态扩展Animal对象以包含一个新字段? 我以为我可以创建一个临时数组并存储结果,但是那样我会丢失有关该动物的信息,也就不会有任何映射。

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

您可以为仅在“ Animals字段上工作的方法扩展“ Animals ,以计算Animals的中间值(例如:您对动物的操作有一个有意义的名称。相反:您的类的大小会增加),也可以创建(临时) Map<Animals, Double>Animals Map<Animals, Double>设为中间值,然后遍历地图以计算均值(pro:您的类的大小没有增加,相反:您的操作名称很有意义)。

通常,您将数据存储在容器中,而不添加到现有类中。 如果您有充分的理由要做,则只想违反此规则。

让我们看一些容器:

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

这些是最重要的数据类型,它们通常与ArrayListHashMap一起提供出色的性能。

在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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM