稀疏数组
情景:
也就是说稀疏数组存储的数据都有特殊意义、
情景:
当一个数组中大部分元素为0 的时候,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
处理方法
- 记录数组一共几行几列,有多少个不同的值
- 把具有不同值的元素的行列以及值记录在一个小规模的数组中,缩小程序的规模
稀疏数组:
row | col | value | |
---|---|---|---|
0 | 原数组总行数 | 原数组总列数 | 有效值个数 |
1 | 第一个有效值所在行数 | 第一个有效值所在列数 | 有效值是多少 |
2 | 第二个有效值所在行数 | 第二个有效值所在列数 | 有效值是多少 |
… | …… | …… | …… |
n | 第N个有效值所在行数 | 第N个有效值所在列数 | 第N个有效值是多少 |
特点
列数 = 3列 固定不变
行数 = 有效值的个数+1
原来的代码规模是11*11
经过稀疏数组转换后变成了3*3
二维数组转稀疏数组的思路
-
遍历原始的二维数组,得到有效值的个数sum
-
根据sum,创建稀疏数组
-
sparseArr int[sum+1][3]
-
将二维数组的有效值数据存入到稀疏数组
稀疏数组转原始的二维数组
先读取我们的稀疏数组第一行,创建原始的二维数组
在读后几行的数据,并赋值给原始的二维数组
代码实现:
public class SparseArray {
public SparseArray() throws IOException {
}
public static void main(String[] args) throws IOException {
//先创建一个原始的二维数组
//0表示无用数据(没有棋子) 1表示黑子 2表示蓝子
//原始的二维数组
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
//输出原数组
// for (int [] row:chessArr1)
// {
// for (int item :row) {
// System.out.print(item+"\t");
// }
// System.out.println();
// }
//转换稀疏数组
//1.先遍历二维数组,得到非零个数
int sum =0 ;
for (int i =0;i<chessArr1.length;i++)
{
for (int j =0;j<chessArr1.length;j++)
{
if (chessArr1[i][j]!=0)
{
sum++;
}
}
}
// System.out.println(sum);
//2.创建我们的稀疏数组
int sparseArray[][] = new int[sum+1][3];
// //给稀疏数组赋值
sparseArray[0][0]=chessArr1.length;
sparseArray[0][1]=chessArr1.length;
sparseArray[0][2] =sum;
// //遍历二维数组,将非0值传给稀疏数组
int count = 0;//count 用于记录是第几个非零数据
for (int i =0;i<chessArr1.length;i++)
{
for (int j =0;j<chessArr1.length;j++)
{
if (chessArr1[i][j]!=0)
{
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArr1[i][j];
}
}
}
// //输出稀疏数组
// System.out.println("-------------");
// for (int i =0 ;i<sparseArray.length;i++)
// {
// System.out.println(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]+"\t");
// }
// //将稀疏数组转换为原始的二维数组
int chessArr2[][] = new int [sparseArray[0][0]][sparseArray[0][1]];
//把有效值赋值到相应的位置上
for (int i = 1;i<sparseArray.length;i++)
{
chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//输出转换回来的二维数组
// for (int [] row:chessArr2)
// {
// for (int item :row) {
// System.out.print(item+"\t");
// }
// System.out.println();
// }
// //稀疏数组存盘
File file = new File("sparesArray.data");
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));
for (int[] row:sparseArray){
for (int item:row)
{
bufferedWriter.write(item+"\t");
}
bufferedWriter.write("\n");
bufferedWriter.flush();
}
//从文件读取我们的稀疏数组
File src = new File("sparesArray.data");
BufferedReader bufferedReader = null;
List<Integer> list = new ArrayList<>();
bufferedReader = new BufferedReader(new FileReader(src));
String line;//行数
while ((line = bufferedReader.readLine())!=null)
{
String[] str = line.split("\t");
for (int i=0;i<str.length;i++)
{
list.add(Integer.parseInt(str[i]));
}
}
if (bufferedReader!=null){
bufferedReader.close();
}
//打印稀疏数组行数
// System.out.println("稀疏数组的行数为: "+Integer.parseInt(list.get(2))+1); //第三个元素代表不为0的元素有多少个,+1代表稀疏数组的行数
int sparseArray2[][]=new int[list.get(2)+1][3];
int j=0;
for(int i=0;i<list.size();i=i+3) {
sparseArray2[j][0]=list.get(i);
sparseArray2[j][1]=list.get(i+1);
sparseArray2[j][2]=list.get(i+2);
j++;
}
System.out.println("--------从硬盘种读取的稀疏数组------------");
for(int[] row2:sparseArray2) {
for(int data:row2) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}