繁体   English   中英

如果我在 java 8 的这个给定示例中有 1000 列,该怎么办

[英]What to do if i have 1000 column in this given example in java 8

从 csv 文件加载数据后,列表如下所示,第一列唯一 id 和 rest 999 具有数据值。 我想根据唯一 ID 对重复记录求和。 由于我必须编写 999 数组,如何简化代码?

下面是一个唯一 id 和 2 个数据值的代码(此代码适用于 2 列):

Integer[] dataPeriod = new Integer[]{101, 2, 4};
Integer[] dataPeriod1 = new Integer[]{102, 3, 5};
Integer[] dataPeriod2 = new Integer[]{101, 4, 6};
Integer[] dataPeriod3 = new Integer[]{102, 5, 7};
Integer[] dataPeriod4 = new Integer[]{102, 7, 9};
Integer[][] data = {dataPeriod, dataPeriod1, dataPeriod2, dataPeriod3, dataPeriod4};

Collection<Integer[]> value = Arrays.stream(data).collect(Collectors.toMap(ints -> ints[0],
            Function.identity(), (a1, a2) -> {
                a1[1] += a2[1];
                a1[2] += a2[2];
                return a1;
            })).values();

如果列表如下:

Integer[] dataPeriod = new Integer[]{101, 2, 4,..................,1000th};
Integer[] dataPeriod1 = new Integer[]{102, 3, 5,..................,1000th};
Integer[] dataPeriod2 = new Integer[]{101, 4, 6,..................,1000th};
Integer[] dataPeriod3 = new Integer[]{102, 5, 7,..................,1000th};
Integer[] dataPeriod4 = new Integer[]{102, 7, 9,..................,1000th};
Integer[][] data = {dataPeriod, dataPeriod1, dataPeriod2, dataPeriod3, dataPeriod4,..................,dataPeriod999th};
Collection<Integer[]> value = Arrays.stream(data).collect(Collectors.toMap(ints -> ints[0],
            Function.identity(), (a1, a2) -> {
                a1[1] += a2[1];
                a1[2] += a2[2];
                ..... += ....;
                ..... += ....;
                ..... += ....;
                ..... += ....;
                ..... += ....;
                a1[999] += a2[999];
           [simplify the code because I have to write 999 array?]
                return a1;
            })).values();

预期的操作:

[0] = {101, 6, 10}
[1] = {102, 15, 21}

您可以使用 Java 现有的求和减少方法:

Integer sum = integers.stream()
.reduce(0, Integer::sum);

这是一种方法。 由于您正在读取 csv 文件,因此您可以即时进行。 这是一个示例数据文件。

101, 2, 4
102, 3, 5
101, 4, 6
102, 5, 7
102, 7, 9
  • 使用扫描仪打开文件
  • 分割线
  • 获取数字id
  • 要么使用 id 作为列表中的第一个值创建条目值,要么将总和添加到列表中。
  • 在对具有相同 id 的列求和后,转换为 List<Integer[]> 并打印
Map<Integer, Integer[]> map = new HashMap<>();
try (Scanner scan =
        new Scanner(new File("f:/testData.txt"))) {
    while (scan.hasNextLine()) {
        String line = scan.nextLine();
        int[] vals = Arrays.stream(line.split("\\s*,\\s*"))
                .mapToInt(Integer::parseInt).toArray();
        
        // initialize the array if absent
        Integer[] arr = map.computeIfAbsent(vals[0], v -> {
            Integer[] a = new Integer[vals.length];
            Arrays.fill(a,0);
            a[0] = vals[0];
            return a;
        });
        
        for (int i = 1; i < arr.length; i++) {
            arr[i] += vals[i];
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

List<Integer[]> list = new ArrayList<>(map.values());

list.forEach(a->System.out.println(Arrays.toString(a)));

印刷

[101, 6, 10]
[102, 15, 21]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM