在另一列

时间:2015-09-04 21:09:41

标签: java list csv arraylist

我正在尝试在列表的第3列中添加值,这些值在第2列中具有相同的值。例如,[2,20003,4] [2,20003,7]将返回[2,20003] ,11],因为他们在中间栏目中共享20003。

public static void main(String[] args) throws IOException
{
    CSVReader reader = new CSVReader(new FileReader("file"), ',', '"', 1);
    List<String[]> allRows = reader.readAll();
    for(String[] row : allRows)
    {
    System.out.println(Arrays.toString(row));
    }
 }

示例输出(以3列输出)     [1,10002,4]     [1,10004,6]     [1,10008,2]     [1,10010,3]     [1,10010,3]     [2,10007,10]     [2,20003,4]     [2,20003,7]     [2,30019,1]     [2,30020,9]

1 个答案:

答案 0 :(得分:0)

这将使用sum替换第三个元素,如果相同的第一个和第二个元素出现多次,则创建重复的项目:

Map<String, Integer> map
                = allRows.stream()
                  .collect(Collectors.groupingBy(a -> a[1], 
                           Collectors.summingInt(a -> Integer.valueOf(a[2]))));
List<String[]> out
                = allRows.stream()
                .map(a -> new String[]{a[0], a[1], map.get(a[1]).toString()})
                .collect(Collectors.toList());

用此替换最后一个语句以消除重复。

out
            = allRows.stream()
            .map(a -> new String[]{a[0], a[1], map.get(a[1]).toString()})
            .map(a -> Arrays.toString(a))
            .distinct()
            .map(s -> s.substring(1, s.length()-1).split(","))
            .collect(Collectors.toList());