使用java
采用顺序存储方式实现稀疏矩阵M1和M2相加的运算
public static void main(String[] args) {
int[][] M1 = {
{1,2,10},{1,3,2},{2,1,5},
{3,2,6},{3,4,7},{5,4,9},
{5,6,4},{6,2,8}
};
int[][] M2 = {
{1,1,6},{1,3,7},{2,3,6},
{3,4,3},{4,4,10},{5,5,6},
{5,6,2},{6,4,9}
};
// 定义中间数组
int[][] middle2 = new int[M1.length + M2.length][3];
// 定义中间数组
int[][] middle = new int[M1.length + M2.length][3];
// 将M1 M2插入结果数组
System.arraycopy(M1,0,middle,0,M1.length);
System.arraycopy(M2,0,middle,M1.length,M2.length);
// 根据第一个元素排序 分组
Map<Integer, List<int[]>> firstSort = Arrays.stream(middle)
.sorted(Comparator.comparing(
item -> item[0])
).collect(Collectors.groupingBy(item1 -> item1[0]));
// 输出数组下标 全局
AtomicReference<Integer> resultIndex = new AtomicReference<>(0);
// 循环遍历
firstSort.forEach((firsIndex,array)->{
// 根据第二个元素分组
Map<Integer, List<int[]>> secondSort = array.stream()
.sorted(Comparator.comparing(
item -> item[1])
).collect(Collectors.groupingBy(item1 -> item1[1]));
// 循环组装数据
secondSort.forEach((secondIndex,secondArray)->{
middle2[resultIndex.get()][0] = secondArray.get(0)[0];
middle2[resultIndex.get()][1] = secondArray.get(0)[1];
if(secondArray.size() > 1){
// 一二号位一致,三号位相加
Integer third = secondArray.stream().mapToInt(item -> item[2]).sum();
middle2[resultIndex.get()][2] = third;
}else {
middle2[resultIndex.get()][2] = secondArray.get(0)[2];
}
resultIndex.set(resultIndex.get() + 1);
});
});
// 输出数组
int[][] result = new int[resultIndex.get()][3];
// 赋值
System.arraycopy(middle2,0,result,0,result.length);
for (int[] ints : result) {
System.out.println(Arrays.toString(ints));
}
}