java 稀疏矩阵

来源:互联网 发布:网页游戏自动挂机软件 编辑:程序博客网 时间:2024/06/05 15:28

java稀疏矩阵


描述: 
实现一个稀疏矩阵的正解析,反解析。

正解析: 
将矩阵中非0的数据,以(数据,行下标,列下标)方式输出成新的矩阵,并附上矩阵的统计信息(有效数据个数,原矩阵行数,原矩阵列数)

反解析: 
将正解析后的矩阵,反解析。

数据变化: 
=== 生成随机矩阵 === 
4行 5列 
=== 输出矩阵 === 
3,3,3,2,1 
3,2,2,3,3 
0,3,1,3,3 
2,1,3,1,1 
=== 正解析矩阵 === 
3,0,0 
3,0,1 
3,0,2 
2,0,3 
1,0,4 
3,1,0 
2,1,1 
2,1,2 
3,1,3 
3,1,4 
3,2,1 
1,2,2 
3,2,3 
3,2,4 
2,3,0 
1,3,1 
3,3,2 
1,3,3 
1,3,4 
19,4,5 
=== 反解析矩阵 === 
3,3,3,2,1 
3,2,2,3,3 
0,3,1,3,3 
2,1,3,1,1

代码:

package com.test;import java.util.Random;/** * Created by CDP * 2016/11/28. */public class Matrix1 {    /**     * *************************************************************************************************************     * 生成随机矩阵     */    public static int[][] makeMatrix(int x, int y) {        int matrix[][] = new int[x][y];        for (int i = 0; i < matrix.length; i++) {            for (int j = 0; j < matrix[1].length; j++) {                matrix[i][j] = new Random().nextInt(4);            }        }        return matrix;    }    /**     * ***********************************************************************************************************     * === 正解析矩阵 ===     * 接收入参随机矩阵,计算出行和列,并以计算出的行和列创建新的二维数组     * 双for循环遍历入参矩阵,将矩阵(数据,行,列)赋值到新的二维数组实现正解析     * 二维数组末尾添加一行矩阵统计信息(有效数据,入参矩阵总该行数,入参矩阵总列数)用于反解析     */    public static int[][] positiveMatrix(int[][] matrix) {        int row = matrix.length; //计算入参矩阵的行        int line = matrix[0].length; //计算入参矩阵的列        int allRow = row * line + 1; //计算入参矩阵所有数据,并+1行为统计信息预留        int posMatrix[][] = new int[allRow][3]; //创建一个二维数组用于返回        int allData = 0; //所有 数据 的 计数器        int effData = 0; //所有 有效数据 的 计数器        for (int i = 0; i < matrix.length; i++) {            for (int j = 0; j < matrix[i].length; j++) {                if (matrix[i][j] != 0) effData++; //有效数据记数                if (allData < allRow) {                    posMatrix[allData] = new int[]{matrix[i][j], i, j}; //解析矩阵并赋值到二维数组                    allData++; //所有数据记数                }                if (allData == allRow - 1) {                    posMatrix[allData] = new int[]{effData, row, line}; //矩阵统计信息加入二维数组最后一行                }            }        }        return posMatrix;    }    /**     * *************************************************************************************************************     * === 反解析矩阵 ===     * 根据正解析矩阵最后的统计信息(有效数据个数,行,列)取行和列,用于创建新的二维数组     * 创建入参矩阵所有数据计数器用于遍历入参矩阵,遍历矩阵每个数组的第一个值赋值到新创建的二维数组中,实现反解析     */    public static int[][] reverseMatrix(int[][] matrix) {        int row = matrix[matrix.length - 1][matrix[0].length - 2]; //计算入参矩阵的行        int line = matrix[matrix.length - 1][matrix[0].length - 1]; //计算入参矩阵的列        int allRow = matrix.length - 1; //计算入参矩阵所有数据        int revMatrix[][] = new int[row][line]; //创建一个二维数组用于返回        int allData = 0; //所有 数据 的 计数器        for (int i = 0; i < revMatrix.length; i++) {            for (int j = 0; j < revMatrix[i].length; j++) {                if (allData < allRow) {                    revMatrix[i][j] = matrix[allData][0]; //反解析矩阵并赋值到二维数组                    allData++; //所有数据记数                }            }        }        return revMatrix;    }    /**     * *************************************************************************************************************     * 输出矩阵所有值     */    public static void printMatrix(int[][] matrix) {        for (int i = 0; i < matrix.length; i++) {            for (int j = 0; j < matrix[1].length; j++) {                if (j < matrix[1].length - 1) {                    System.out.print(matrix[i][j] + ",");                } else {                    System.out.print(matrix[i][j]);                }            }            System.out.println();        }    }    /**     * *************************************************************************************************************     * 输出矩阵有效值     * 例如,非0的值     */    public static void printEffMatrix(int[][] matrix) {        for (int i = 0; i < matrix.length; i++) {            String temp = "";            for (int j = 0; j < matrix[1].length; j++) {                temp += matrix[i][j] + ",";            }            if (!temp.startsWith("0")) {                System.out.println(temp.substring(0, temp.length() - 1));            }        }    }    public static void main(String[] args) {        System.out.println("=== 生成随机矩阵 ===");        int x = 4;        int y = 5;        int[][] randomMatrix = makeMatrix(x, y);        System.out.println("    " + x + "行    " + y + "列");        System.out.println("=== 输出随机矩阵 ===");        printMatrix(randomMatrix);        System.out.println("=== 正解析矩阵 ===");        printEffMatrix(positiveMatrix(randomMatrix));        System.out.println("=== 反解析矩阵 ===");        printMatrix(reverseMatrix(positiveMatrix(randomMatrix)));    }}


0 0
原创粉丝点击