[英]How do I pass values between cards in Java CardLayout…this time i have given a good example
[英]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
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.