应用场景
数组中大部分的值都为同一个值。
处理方式
1)第一行记录数组中行数,列数,不同值的数值个数。
2)记录下每个不同值的行列值。
示例
基本的稀疏矩阵:
import java.util.ArrayList;
import java.util.Random;
public class SparseArraysText {
public static void main(String[] args) {
//随机生成矩阵的行列
Random rd = new Random();
int row=0,column=0,sum=0;//行,列,总数
while (row == 0){
row = rd.nextInt(18);
}
column = row;
System.out.println("随机生成:" + row + "行," + column + "列");
int[][] arr = new int[row][column];//创建矩阵
sum = row*column;//计算矩阵元素总数
int pieceNum = 0;//矩阵中的非0数的个数
while (pieceNum == 0){
pieceNum = rd.nextInt((int)Math.floor(Math.sqrt(sum))-1);
}
System.out.println("棋牌中共有:"+pieceNum+"个棋子。");
//棋子所在的坐标
ArrayList<Integer> rowCoordinateList = new ArrayList();//行坐标
ArrayList<Integer> columnCoordinateList = new ArrayList();//列坐标
for (int i = 0; i < pieceNum; i++) {
boolean repeat = true;
int rowCoordinate=0,columnCoordinate=0;
rowCoordinate = rd.nextInt(row);//随机行坐标
columnCoordinate = rd.nextInt(column);//随机列坐标
while (arr[rowCoordinate][columnCoordinate] != 0){
rowCoordinate = rd.nextInt(row);//随机行坐标
columnCoordinate = rd.nextInt(column);//随机列坐标
}
arr[rowCoordinate][columnCoordinate] = rd.nextInt(2)+1;
rowCoordinateList.add(rowCoordinate);//随机行坐标填入集合
columnCoordinateList.add(columnCoordinate);//随机列坐标填入集合
}
//打印
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
//生成稀疏矩阵
int [][] sparseArrays = new int[pieceNum+1][3];
sparseArrays[0][0] = row;//行数
sparseArrays[0][1] = column;//列数
sparseArrays[0][2] = pieceNum;//棋子总数
//正常的获取稀疏矩阵中的棋子的位置以及元素
int count = 1;
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
if (arr[i][j] != 0){
sparseArrays[count][0] = i;
sparseArrays[count][1] = j;
sparseArrays[count][2] = arr[i][j];
count++;
}
}
}
//打印稀疏矩阵
System.out.println("构造的稀疏矩阵如下:");
for (int[] sparseArray : sparseArrays) {
for (int i : sparseArray) {
System.out.printf("%d\t",i);
}
System.out.println();
}
//根据稀疏矩阵还原数组
row = sparseArrays[0][0];
column = sparseArrays[0][1];
int[][] reductionArrays = new int[row][column];//得到行列构造矩阵
for (int i = 1; i < sparseArrays[0][2]+1; i++) {
reductionArrays[sparseArrays[i][0]][sparseArrays[i][1]] = sparseArrays[i][2];//放入棋子
}
System.out.println("还原后的稀疏矩阵:");
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
System.out.printf("%d\t",reductionArrays[i][j]);
}
System.out.println();
}
}
}
这个只是示例,稀疏矩阵是生成的,因此在之前就已经有记录棋子的位置,但一般来说,棋子的位置是不知道的,因此需要遍历整个棋牌获得。