1.如果二维数组中有许多重复的元素,则保存数组是很废空间资源的。可以使用数组的稀疏数组来减小数组的大小。
上述二维数组的稀疏数组如下:
图中给出了这个稀缺数组第一行中每个元素的具体含义。
至于第二行和第三行中元素的含义,我只以第二行为例
第二行中的第三个元素:表示原始数组中的元素“1”
第二行中的第一个元素:元素“1”的行号索引,从0开始
第二行中的第二个元素:元素“1”的列号索引,从0开始
下面是完整的代码,数组转换部分是指教程视频,IO部分是教程视频中给出的作业。
package com.atguigu.sparsearray; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; public class SparseArray { public static void main(String[] args) throws Exception { //定义原始的数组 int [][] chessArray=new int[11][11];//元素的默认值是0 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++) //chessArray.length其实是二维数组的行数 { for (int j = 0; j < chessArray.length; j++) //遍历一行,也就是一维数组,这里行数和列数相等,所以可以用chessArray.length { if(chessArray[i][j]!=0) { sum++; } } } //定义一个稀疏数组 int [][] sparseArray=new int[sum+1][3];//稀疏数组的列数是固定的“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(); } } }