将arraylist拆分为子列表,排序子列表,执行计算并编写新的.csv输出

时间:2015-09-28 08:59:13

标签: java csv arraylist

我有一个从迭代中创建的arraylist

,

将会有许多具有相同身份的实例,具有不同的时间,纬度,经度,点数和距离。因此,我想将arraylist ulplist分解为各种子列表。然后,我想按时间对这些子列表进行排序/排序。在按时间对子列表进行排序后,我想执行一些计算,然后将它们连接起来并将结果输出到.csv文件中。 我只需要知道如何将arraylist分解为我想要的这些子列表(这将是暂时的)然后如何根据时间排序它们,这是在第一个[[04ae46c177169feac5f697eexxxx,1418601075,1.375579,103.960797,null, 1000.0]] [[04ae46c177169feac5f697eexxxx,1418602016,1.381164,103.966164,null, 1000.0]] [[04ae46c177169feac5f697eexxxx,1418603148,1.381164,103.966164,null, 1000.0]] [[04ae46c177169feac5f697eexxxx,1418601994,1.381164,103.966164,null, 1000.0]] [[055ee328d4d297500e9a7f4cffe6xxxx,1418602721,1.313564,103.878443,null, 1000.0]] [[055ee328d4d297500e9a7f4cffe6xxxx,1418602119,1.313564,103.878443,null, 1000.0]] [[055ee328d4d297500e9a7f4cffe6xxxx,1418601901,1.313564,103.878443,null, 1000.0]] [[055ee328d4d297500e9a7f4cffexxxx,1418600991,1.313564,103.878443,null, 1000.0]] [[055ee328d4d297500e9a7f4cffe6xxxx,1418600132,1.313564,103.878443,null, 1000.0]] [[00cd34bad39d19f8e2a335b444bxxxx,1418600273,1.345569,103.696973,null, 1000.0]] [[04036dd2f45253bc9c24810f8e3exxxx,1418603285,1.301047,103.853357,null, 1000.0]] 分隔符之后。

示例输出:

// Reading Grid's row and col size
gridInputValues = Console.ReadLine().Split(' ');
gridRow = int.Parse(gridInputValues[0]);
gridCol = int.Parse(gridInputValues[1]);
gridMatrix2D = new int[gridRow, gridCol];
// Reading Grid's row * col matrix values
for( int r = 0; r < gridRow; r++ ) 
{
    //string[] inputVal = Console.ReadLine().Split('');
    //string[] inputVal = Console.ReadLine().Split(string.Empty));
    string inputVal = Console.ReadLine();
    for( int c = 0; c < gridCol; c++ ) 
    {
        //gridMatrix2D[r, c] = int.Parse(inputVal[c]);
        gridMatrix2D[r, c] = int.Parse(inputVal[c].ToString());
    }

3 个答案:

答案 0 :(得分:1)

您可以使用java 8流,例如:

Map<String, List<String>> groups = ulpList.stream().collect(Collectors.groupingBy(e -> e.split(",")[0]));

ArrayList<List<String>> sorted = new ArrayList<>();
for (List<String> s : groups.values()) {
    sorted.add(s.stream().sorted((s1, s2) -> {
        long ts1 = Long.valueOf(s1.split(",")[1]);
        long ts2 = Long.valueOf(s2.split(",")[1]);
        return Long.compare(ts1, ts2);
    }).collect(Collectors.toList()));
}
// do calculations 
// ...

当然你可以将字符串更改为字符串[]以减少分割数量,并将其写得更有效和更优雅,但我想保持简单

答案 1 :(得分:0)

您首先插入然后拆分,为什么不创建包含链表的地图。由于您需要id是唯一的,因此map可以执行此操作,其余的详细信息将存储在列表中。 至于需要基于时间排序,您可以使用比较器。

答案 2 :(得分:0)

您应该将List<String>转换为Map<String, List<String[]>>以进行进一步处理。最后,您可以再次加入这些行并将其写入CSV文件。

Java 7

public Map<String, List<String[]>> groupAndSort(List<String> ulpList) {
    Map<String, List<String[]>> grouping = new TreeMap<>();
    for (String line : ulpList) {
        String[] split = line.split(",");
        List<String[]> value = grouping.get(split[0]);
        if (value == null) {
            value = new ArrayList<>();
            grouping.put(split[0], value);
        }
        value.add(split);
    }
    for (List<String[]> value : grouping.values()) {
        Collections.sort(value, new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                return Long.compare(Long.parseLong(o1[1]), Long.parseLong(o1[2]));
            }
        });
    }
    return grouping;
}

Java 8

public Map<String, List<String[]>> groupAndSort8(List<String> ulpList) {
    Map<String, List<String[]>> grouping = ulpList.stream().map(l -> l.split(","))
            .collect(Collectors.groupingBy(l -> l[0], TreeMap::new, Collectors.toList()));
    grouping.forEach((k, v) -> Collections.sort(v, Comparator.comparingLong(l -> Long.parseLong(l[1]))));
    return grouping;
}