我想对其进行过滤,以便它只使用 PART 和 FUNCTION 的每个不同组合的最新信息,这样我最终只会得到每个组合的少数结果,而不是数千个过时的结果。 这里的ID是基于时间的。

这是我目前所拥有的:

    while((line = br.readLine())!= null){  
        info = line.split(","); 
 
        Map<String,String> qgi=new HashMap<String,String>(); 
 
        qgi.put("ID",info[0]); 
        qgi.put("FUNCTION",info[1]); 
        qgi.put("PART",info[2]); 
        qgi.put("STATE",info[3]); 
        sourceList.add(qgi); 
    } 
 
    for (int i = 0, len = sourceList.size(); i < len; i++) { 
        Map<String,String> gqi =(Map) sourceList.get(i); 
 
        if ( gqi.get("PART").equals("chw") && gqi.get("FUNCTION").equals("diskusage") && gqi.get("ID").equals("20181122125601"))//Get highest value with those parameters 
        {  
            resultList.add(gqi); 
        } 
    } 

因此,目前我的 ID 等于特定日期和时间,并且我希望它成为该特定组合(chw 和 diskusage)的最高 ID。

我基本上想做类似的事情

if(a.get("b").equals("something") && a.get("c").equals("something") && thisCombinationsID >= everyOtherIDWithThisCombination{ 
    resultList.add(a); 
} 

请您参考如下方法:

创建一个类RowKey ,带有 part和一个 function ,以及适当的equalshashCode覆盖(IDE 可以为您生成)。

创建一个类Row ,带有 rowKey (类型 RowKey ),一个 id和一个 state

创建 Map<RowKey, Row>对于每个行键,包含具有最大 ID 的行(最初为空)。

遍历文件的各行。为每一行创建一个 Row 实例。

然后检查映射中是否已存在该行键的条目。如果不是,或者新行的 ID 大于现有行,则将新行存储在映射中。 Map.merge可以帮助做到这一点。

最后, map 的值包含您想要的内容。

该实现留给读者作为练习。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!