比较不同的ArrayList元素

时间:2017-04-03 06:03:07

标签: java arraylist

好的,我有几个包含类似格式的文本文件:

    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 ****** **)列一起。

如何比较不同文本文档中的第三列?

2 个答案:

答案 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);
}