好的,我有几个包含类似格式的文本文件:
497 Q0 WTX091-B06-138 0 0.415344133 GROUP001
497 Q0 WTX091-B09-92 1 0.362342072 GROUP001
497 Q0 WTX091-B09-76 2 0.354034424 GROUP001
497 Q0 WTX091-B09-57 3 0.349649535 GROUP001
497 Q0 WTX091-B43-79 4 0.3217919 GROUP001
497 Q0 WTX091-B43-56 5 0.321450733 GROUP001
.
.
.
(actually there are 1000 lines in each text document)
我已将每个文档存储到按行分隔的arraylist中。具有挑战性的部分是我必须在每个文件中寻找第三列(WTX *** - B ** - **),如果它们是相同的那么我必须添加他们的第五列(0.3 ****** **)列一起。
如何比较不同文本文档中的第三列?
答案 0 :(得分:2)
由于我假设你的文本文件行是空格分隔的,所以应该这样做。它假设您使用的是 Java 8 。您可以轻松升级此解决方案以直接读取文件,因为Java 8提供了 Files.lines - 方法。
因此解决方案通过空格分隔符拆分文档的每一行。
List<String> list = Arrays.asList(
"497 Q0 WTX091-B06-138 0 0.415344133 GROUP001",
"497 Q0 WTX091-B09-92 1 0.362342072 GROUP001",
"497 Q0 WTX091-B09-76 2 0.354034424 GROUP001",
"497 Q0 WTX091-B09-57 3 0.349649535 GROUP001",
"497 Q0 WTX091-B43-79 4 0.3217919 GROUP001",
"497 Q0 WTX091-B43-56 5 0.321450733 GROUP001");
Map<String, Double> sumMap = list.stream()
.map(s -> s.split("\\s+"))
.collect(groupingBy(s -> s[2],
summingDouble(s -> Double.valueOf(s[4]))));
System.out.println(sumMap);
要处理所有文件,您可以将所有文件内容读入list
,或者从文件流开始,为每个文件内容执行flatMap
。
答案 1 :(得分:0)
也许是这样的?创建类似实体类的东西,然后使用Stream API将其转换为map,如果有相同的键,则添加其double值:
public static class Data
{
public int id;
public String stringId;
public String plateNumber;
public int numId;
public double value;
public String name;
public Data(int id, String stringId, String plateNumber, int numId, double value, String name)
{
this.id = id;
this.stringId = stringId;
this.plateNumber = plateNumber;
this.numId = numId;
this.value = value;
this.name = name;
}
}
public static void main(String[] args)
{
List<Data> ls = new ArrayList<>();
ls.add(new Data(497, "Q0", "WTX091-B06-138", 0, 0.415344133, "GROUP001"));
ls.add(new Data(497, "Q0", "WTX091-B09-92", 1, 0.362342072, "GROUP001"));
ls.add(new Data(497, "Q0", "WTX091-B09-76", 2, 0.354034424, "GROUP001"));
ls.add(new Data(497, "Q0", "WTX091-B09-57", 3, 0.349649535, "GROUP001"));
ls.add(new Data(497, "Q0", "WTX091-B43-79", 4, 0.3217919, "GROUP001"));
ls.add(new Data(497, "Q0", "WTX091-B43-56", 5, 0.321450733, "GROUP001"));
Map<String, Double> map = ls.stream()
.collect(Collectors.toMap(k -> k.plateNumber, v -> v.value, (v1, v2) -> v1 + v2));
System.out.println(map);
}