簡體   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