在第一列中查找重复项,并根据第三列取平均值

问题描述 投票:0回答:2

我的问题是,我需要计算每个ID的平均时间并计算每个ID的平均时间。

样本数据

T1,2020-01-16,11:16pm,start T2,2020-01-16,11:18pm,start T1,2020-01-16,11:20pm,end T2,2020-01-16,11:23pm,end

我以这样的方式编写了代码,使得我将第一列和第三列保留在地图中。。类似

T1, 11:16pm

但是将这些值保存在地图中后,我无法计算这些值。还尝试将它们保留在字符串数组中,并逐行拆分。同样面临该方法的问题。**公共类AverageTimeGenerate {

public static void main(String[] args) throws IOException {
    File file = new File("/abc.txt"); 
    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
        while (true) {
            String line = reader.readLine();
            if (line == null) {
               break;
            }

          ArrayList<String> list = new ArrayList<>();
          String[] tokens = line.split(",");
          for (String s: tokens) {
              list.add(s);
          }     

          Map<String, String> map = new HashMap<>();
          String[] data = line.split(",");
          String ids= data[0];
          String dates = data[1];
          String transactionTime = data[2];
          String transactionStartAndEndTime = data[3];

          String[] transactionIds = ids.split("/n");
          String[] timeOfEachTransaction = transactionTime.split("/n");
          for(String id : transactionIds) {
              for(String time : timeOfEachTransaction) {
                  map.put(id, time);
              }
          }
      }    
   }
}

}

Can anyone suggest me is it possible to find duplicates in a map and compute values in map, Or is there any other way I can do this so that the output should be like 

`T1 2:00
 T2 5:00'

java arrays string java-8 dynamic-arrays
2个回答
0
投票

我不知道您要完成平均时间的逻辑是什么,但是您可以将数据保存在地图中以完成一项特定交易。地图结构可以像这样。交易ID将是关键,所有时间都将在数组列表中。

Map<String,List<String>> map = new HashMap<String,List<String>>();

0
投票

您可以这样:

 Map<String, String> result = Files.lines(Paths.get("abc.txt"))
            .map(line -> line.split(","))
            .map(arr -> {
                try {
                    return new AbstractMap.SimpleEntry<>(arr[0],
                                          new SimpleDateFormat("HH:mm").parse(arr[2]));
                } catch (ParseException e) {
                    return null;
                }
            }).collect(Collectors.groupingBy(Map.Entry::getKey,
                    Collectors.collectingAndThen(Collectors
                                    .mapping(Map.Entry::getValue, Collectors.toList()),
                            list -> toStringTime.apply(convert.apply(list)))));

为简单起见,我已经声明了两个函数。

Function<List<Date>, Long> convert = list -> (list.get(1).getTime() - list.get(0).getTime()) / 2;
Function<Long, String> toStringTime = l -> l / 60000 + ":" + l % 60000 / 1000;
© www.soinside.com 2019 - 2024. All rights reserved.