直接上本人对稀疏数组的理解,就是在一个数组中存放了大量的无用值,比如
0
, 而且非0
值存放的位置也特别分散,这样就占用了大量的存储空间,让我们在后期维护的时候费时费力。因此我们提出了稀疏数组
的概念。
一、原数组
二、稀疏数组
2.1 稀疏数组存放内容介绍
第一行依次存放的是
原数组总行数
,原数组总列数
,数组所包含有用值个数
接下来依次存放的是第一个值所在行
,所在列
,数值
,以此类推
三、代码介绍
主方法:
public static void main(String[] args) {
// 创建一个二维数组 11*11
// 0表示没有棋子, 1表示黑子, 2表示篮子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 输出数组
System.out.println("----------原始二维数组------------");
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println(" ");
}
// 得到不为零的数据的个数
int sum = getSum(chessArr1);
// 创建稀疏数组
int[][] sparseArray = new int[sum + 1][3];
// 给稀疏数组赋值
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
// 定义两个下标来记录数据位置
int i = 1, j = 0;
for (int k = 0; k < 11; k++) {
for (int l = 0; l < 11; l++) {
if (chessArr1[k][l] != 0) {
sparseArray[i][j++] = k;
sparseArray[i][j++] = l;
sparseArray[i][j] = chessArr1[k][l];
i++;
j = 0;
}
}
}
System.out.println("------------打印稀疏数组---------------");
System.out.printf("row\tcol\tval\n");
for (int[] row1 : sparseArray) {
for (int data : row1) {
System.out.printf("%d\t", data);
}
System.out.println(" ");
}
// 1.读取稀疏数组第一行的数据,根据该数据创建数组
int row = sparseArray[0][0];
int col = sparseArray[0][1];
int[][] chessArr2 = new int[row][col];
for (int k = 1; k < sparseArray.length; k++) {
chessArr2[sparseArray[k][0]][sparseArray[k][1]] = sparseArray[k][2];
}
System.out.println("-------------稀疏数组还原--------------");
for (int[] row2 : chessArr2) {
for (int data : row2) {
System.out.printf("%d\t",data);
}
System.out.println(" ");
}
}
定义一个小方法来返回不为零的数据的个数
/**
* 根据传入的数组返回不为零的数据的个数
*
* @param array
* @return
*/
public static int getSum(int[][] array) {
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j] != 0) {
sum++;
}
}
}
return sum;
}
四、测试结果
----------原始二维数组------------
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
------------打印稀疏数组---------------
row col val
11 11 2
1 2 1
2 3 2
-------------稀疏数组还原--------------
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
五、全部代码
package com.wolf.SparseArray;
/**
* 稀疏数组
* <p>
* row col val
* 0 11 11 2
* 1 1 2 1
* 2 2 3 2
*/
public class SparseArray {
public static void main(String[] args) {
// 创建一个二维数组 11*11
// 0表示没有棋子, 1表示黑子, 2表示篮子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
// 输出数组
System.out.println("----------原始二维数组------------");
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println(" ");
}
// 得到不为零的数据的个数
int sum = getSum(chessArr1);
// 创建稀疏数组
int[][] sparseArray = new int[sum + 1][3];
// 给稀疏数组赋值
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
// 定义两个下标来记录数据位置
int i = 1, j = 0;
for (int k = 0; k < 11; k++) {
for (int l = 0; l < 11; l++) {
if (chessArr1[k][l] != 0) {
sparseArray[i][j++] = k;
sparseArray[i][j++] = l;
sparseArray[i][j] = chessArr1[k][l];
i++;
j = 0;
}
}
}
System.out.println("------------打印稀疏数组---------------");
System.out.printf("row\tcol\tval\n");
for (int[] row1 : sparseArray) {
for (int data : row1) {
System.out.printf("%d\t", data);
}
System.out.println(" ");
}
// 1.读取稀疏数组第一行的数据,根据该数据创建数组
int row = sparseArray[0][0];
int col = sparseArray[0][1];
int[][] chessArr2 = new int[row][col];
for (int k = 1; k < sparseArray.length; k++) {
chessArr2[sparseArray[k][0]][sparseArray[k][1]] = sparseArray[k][2];
}
System.out.println("-------------稀疏数组还原--------------");
for (int[] row2 : chessArr2) {
for (int data : row2) {
System.out.printf("%d\t",data);
}
System.out.println(" ");
}
}
/**
* 根据传入的数组返回不为零的数据的个数
*
* @param array
* @return
*/
public static int getSum(int[][] array) {
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j] != 0) {
sum++;
}
}
}
return sum;
}
}