- 如果一个二维数组有很多的元素是重复的,那么存储这个数组就比较废空间,可以用这个数组的稀疏数组,达到缩小数组规模的目的。
上面那个二维数组的稀疏数组如下图:
这个稀疏数组的第一行各个元素具体是什么含义,图中已经标明。
至于第二行和第三行各个元素的含义,我只拿第二行举例(第三行可以类比)。
- 第二行第3个元素:代表原数组中的元素“1”
- 第二行第1个元素:元素“1”的行号索引,索引从0开始
- 第二行第2个元素:元素“1”的列号索引,索引从0开始
总之,第二行元素的含义,用一句话来讲,就是元素“1”在原数组中的第2行第3列(因为索引从0开始,也就是1+1行,2+1列)。
- 搞明白了稀疏数组的含义,那么,有两个任务去做
- 原始数组→稀疏数组;
- 稀疏数组→原始数组
也就是在这两个数组之间进行转换。
第一个任务相对复杂一点,第二个任务很简单。
- 下面是完整的代码,数组转换部分参考了教学视频,IO部分是教学视频给出的作业,自己随便写的,可能写得不好。
package sparsearray;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
public class Demo2
{
public static void main(String[] args) throws Exception
{
int [][] chessArray=new int[11][11];
chessArray[1][2]=1;
chessArray[2][3]=2;
for (int[] is : chessArray)
{
for (int a : is)
{
System.out.print(a+"\t");
}
System.out.println();
}
int sum=0;
for (int i = 0; i < chessArray.length; i++)
{
for (int j = 0; j < chessArray.length; j++)
{
if(chessArray[i][j]!=0)
{
sum++;
}
}
}
int [][] sparseArray=new int[sum+1][3];
sparseArray[0][0]=11;
sparseArray[0][1]=11;
sparseArray[0][2]=sum;
int count=0;
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
if(chessArray[i][j]!=0)
{
count++;
sparseArray[count][0]=i;
sparseArray[count][1]=j;
sparseArray[count][2]=chessArray[i][j];
}
}
}
System.out.println("-----------------------------");
System.out.println("稀疏数组:");
for (int[] is : sparseArray)
{
for ( int s2 : is)
{
System.out.print(s2+"\t");
}
System.out.println();
}
System.out.println("-----------------------------");
System.out.println("把稀疏数组保存到文件中。。。");
FileOutputStream fileOutputStream=new FileOutputStream(new File("chess.txt"));
for (int i = 0; i < sparseArray.length; i++)
{
for (int j = 0; j < 3; j++)
{
int a=sparseArray[i][j];
if(j==2)
{
fileOutputStream.write((String.valueOf(a)).getBytes());
}
else
{
fileOutputStream.write((String.valueOf(a)+",").getBytes());
}
}
fileOutputStream.write("\n".getBytes());
}
System.out.println("------------------");
System.out.println("读取文件中的稀疏数组并恢复成原来的数组:");
BufferedReader bufferedReader=new BufferedReader(new FileReader("chess.txt"));
String line=null;
int c=0;
String row=null;
String col=null;
int [][] chessRestore=null;
while((line=bufferedReader.readLine())!=null)
{
c++;
if(c==1)
{
String [] array=line.split(",");
row=array[0];
col=array[1];
chessRestore=new int[Integer.parseInt(row)][Integer.parseInt(col)];
}
else
{
String [] array=line.split(",");
String hang=array[0];
String lie=array[1];
String val=array[2];
chessRestore[Integer.parseInt(hang)][Integer.parseInt(lie)]=Integer.parseInt(val);
}
}
for (int[] is : chessRestore)
{
for (int is2 : is)
{
System.out.print(is2+"\t");
}
System.out.println();
}
}
}
- 运行结果:
之所以要把稀疏数组保存到文件中,是因为五子棋游戏要求有存档的功能,肯定要把棋盘保留下来。