过滤并使用txt文件中的文本



我想对它进行筛选,使它只使用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);
}

创建一个类RowKey,其中包含partfunction,以及适当的equalshashCode覆盖(IDE可以为您生成(。

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

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

遍历文件的行。对于每一行,创建一个Row实例。

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

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

实现留给读者练习。

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);

最新更新