从txt文件中过滤和使用文本

时间:2018-11-26 13:00:54

标签: java list dictionary

我希望对其进行过滤,以便它仅对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和磁盘使用率)的最高ID。

我基本上想做类似的事情

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

2 个答案:

答案 0 :(得分:1)

使用RowKeypart创建一个类function,并使用适当的equalshashCode覆盖(IDE可以为您生成) 。

创建一个类Row,其中包含rowKey(类型为RowKey),idstate

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

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

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

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

该实现留给读者练习。

答案 1 :(得分:0)

final class Data {

    private int id;
    private final String function;
    private final String part;
    private final String state;

    public Data(String id, String function, String part, String state) {
        this.id = Integer.parseInt(id);
        this.function = function;
        this.part = part;
        this.state = state;
    }
}

List<Data> sourceList = new ArrayList<>();

while ((line = br.readLine()) != null) {
    String[] info = line.split(",");
    sourceList.add(new Data(info[0], info[1], info[2], info[3]));
}

final Predicate<Data> specificCombination = data -> "something".equals(data.function) && "something".equals(data.part);
final Comparator<Data> compareByIdDesc = (d1, d2) -> Integer.compare(d2.id, d1.id);
Data data = sourceList.stream().filter(specificCombination).min(compareByIdDesc).orElse(null);
相关问题