[英]Java pipe and filter pattern issue
我有一个List<Animals>
public class Animals{
int legs;
int age;
int eyes;
//getters , setters
}
我想在列表上以任何组合执行不同的操作。 例如,计算平均值,计算中位数,计算两个字段的中间值等等。
在特定情况下,我想根据Animal legs
和Animal 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
映射到特定数据类型列表的映射。 这些是最重要的数据类型,它们通常与ArrayList
和HashMap
一起提供出色的性能。
在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.