Java 带流的组列表

Java 带流的组列表,java,Java,我的清单如下 List<Status> deviceStatus = Arrays.asList( new Status("ON", 10), // Start new Status("ON", 25), new Status("OFF", 40), // End new Status("ON", 10), // Start

我的清单如下

List<Status> deviceStatus = Arrays.asList(
                new Status("ON",  10), // Start
                new Status("ON",  25),
                new Status("OFF", 40), // End
                new Status("ON",  10), // Start
                new Status("OFF", 20), // End
                new Status("ON",  10), // Start
                new Status("ON",  20),
                new Status("ON",  32),
                new Status("ON",  44),
                new Status("OFF", 54)  //End
        );
List deviceStatus=Arrays.asList(
新状态(“开”,10),//开始
新身份(“ON”,25),
新状态(“关闭”,40),//结束
新状态(“开”,10),//开始
新状态(“关闭”,20),//结束
新状态(“开”,10),//开始
新身份(“ON”,20),
新身份(“ON”,32),
新身份(“ON”,44),
新状态(“关闭”,54)//结束
);

我想分组Start--End(可以跳过中间的开始)并计算差值。我期望的输出是40-10,20-10,54-10。列表大小将适中或较高,如(2500-4000)我正在尝试使用流()实现它。是否可能,或者我应该使用foreach循环来计算它?

我建议您不要使用流。流的设计目的是提供将有限的操作序列应用于函数样式的元素源的能力,而不是存储元素


这是可以使用循环执行的正常操作。

我想说的是,您不应该使用列表,而应该使用树映射,并获取它的子列表。这要快得多

public static void main(String[] args) {
    TreeMap<Integer, Status> statustMap = new TreeMap<Integer, Status>();
    statustMap.put(10, new Status("ON",  10));
    statustMap.put(25, new Status("ON",  25));
    statustMap.put(40, new Status("OFF",  45));
    statustMap.put(10, new Status("ON",  10));
    statustMap.put(20, new Status("OFF",  20));

    find(statustMap, 40, 10);

}

static SortedMap<Integer, Status> find(TreeMap<Integer, Status> statustMap, Integer start, Integer end){
    return statustMap.subMap(start, end);
}
publicstaticvoidmain(字符串[]args){
树映射状态映射=新树映射();
状态映射放置(10,新状态(“打开”,10));
状态映射放置(25,新状态(“打开”,25));
状态映射放置(40,新状态(“关闭”,45));
状态映射放置(10,新状态(“打开”,10));
状态映射放置(20,新状态(“关闭”,20));
查找(statustMap,40,10);
}
静态SortedMap查找(树映射状态映射、整数开始、整数结束){
返回状态映射子映射(开始、结束);
}

使用最容易实现目标的方法。溪流不是一个很好的选择。我想你不能单纯用溪流来实现这一点。由于您需要访问过去的数据点,您可能还需要使用HashMap。@SajithDilshan我真的不知道HashMap如何帮助您做到这一点。@JBNizet我想,他可以使用HashMap存储最近的过去数据(可以在O(n)中检索)来计算差异。他只需要一个差异列表,以及要与下一个关闭状态关联的当前打开状态。映射是键/值存储。这里没有键/值。无论如何,算法相当简单,OP应该自己尝试一些东西。