【问题标题】:Compare different ArrayList elements比较不同的 ArrayList 元素
【发布时间】:2017-04-03 06:03:06
【问题描述】:

好的,我有几个包含类似格式的文本文档,如下所示:

    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)

我已将每个文档存储到一个以行分隔的数组列表中。具有挑战性的部分是我必须在每个文档中查找第三列(WTX***-B**-**),如果它们相同,那么我必须添加它们的第五列(0.3****** **) 列在一起。

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

【问题讨论】:

  • 第五列还是第四列?
  • "497"为第一列"Q0"为第二列,"WTX***-B**-**"为第三列,单数递增位为第四列,"(0.3** ******)”是第五个,“GROUP001”是第六个。
  • 它的开头是错误的。您不会创建多个列表。如果该数据在逻辑上“属于”在一起;然后创建一个代表 single 完整行的类;然后有一个包含所有数据的列表。

标签: java arraylist


【解决方案1】:

因为我假设您的文本文件行是空格分隔的,所以应该这样做。它假定您使用的是 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

【讨论】:

    【解决方案2】:

    也许是这样的?创建一个实体类之类的东西,然后使用 Stream API 将其转换为地图,如果有相同的键,则添加其双精度值:

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

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多