如果我在 java 8 中的这个给定示例中有 1000 列,该怎么办
What to do if i have 1000 column in this given example in java 8
从 csv 文件加载数据后,列表如下所示,第一列唯一 ID 和其余 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();
预期OP:
[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
并打印
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]
从 csv 文件加载数据后,列表如下所示,第一列唯一 ID 和其余 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();
预期OP:
[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
并打印
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]