采用顺序存储方式实现稀疏矩阵M1和M2相加的运算

使用java

采用顺序存储方式实现稀疏矩阵M1和M2相加的运算

img

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));
    }

}