一、稀疏数组
当一个数组大部分为0,或为同一个值的时候,可以使用稀疏数组来保存该数组。
处理步骤:
1) 记录数组一共有几行几列,有多少个不同的值。
2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,缩小程序的规模。
1.二维数组转换稀疏数组的思路
1) 遍历原始二维数组,得到有效数据的个数sum。
2) 根据sum创建稀疏数组sparseArr int[sum+1][3]。
3) 将二维数组的有效数据存入到稀疏数组。
代码如下(示例):
public class SparseArray {
public static void main(String[] args) throws IOException {
// 一、创建一个原始的二维数组
// 0表示没有棋子,1表示黑子,2表示蓝子
int[][] chessArray =new int[11][11];
chessArray[1][2]=1;
chessArray[2][3]=2;
// 输出二维数组
for (int[] row:chessArray) {
for (int data:row) {
System.out.print(data+"\t");
}
System.out.println();
}
/*二、二维数组转换稀疏数组的思路
1) 遍历原始二维数组,得到有效数据的个数sum。
2) 根据sum创建稀疏数组sparseArr int[sum+1][3]。
3) 讲二维数组的有效数据存入到稀疏数组。*/
int sum =0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(chessArray[i][j]!=0){
sum++;
}
}
}
System.out.println("sum="+sum);
int[][] sparseArr =new int[sum+1][3];
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[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++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArray[i][j];
}
}
}
System.out.println();
System.out.println("得到的稀疏数组为:");
for(int[] row:sparseArr){
for(int data:row){
System.out.print(data+"\t");
}
System.out.println();
}
2.稀疏数组转原始二维数组
1) 读取稀疏数组的第一行,根据第一行数据创建原始二维数组。
2) 在读取稀疏数组后几行的数据,并赋值给原始的二维数组即可。
代码如下(示例):
int[][] chessArray2 =new int[sparseArr[0][0]][sparseArr[0][1]];
System.out.println("恢复后的二维数组:");
for (int i = 1; i < sparseArr.length; i++) {
chessArray2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
for(int[] row:chessArray2){
for(int data:row){
System.out.print(data+"\t");
}
System.out.println();
}
3.将稀疏数组保存到磁盘上,如map.data
System.out.println("将稀疏数组保存到磁盘上并且命名为map.data");
File file = new File("D:\\测试-开发学习\\数据算法与结构\\map.data");
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
System.out.println("写入中----------");
for(int i = 0; i < sparseArr.length; i++) {
osw.write(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");
}
osw.close();//关闭输出流
fos.close();//关闭输出流
System.out.println("写入磁盘成功");
4.读取磁盘上map.data文件
System.out.println("读取中----------");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
StringBuffer sb = new StringBuffer();
while (isr.ready()){
sb.append((char)isr.read());
}
isr.close();
fis.close();
System.out.println("读取成功");
String ss = sb.toString();//文件转换成字符
String[] sb1 = sb.toString().split(",");//拆成字符串
System.out.printf("从磁盘读取的字符串为:\n%s\n", ss);//格式化输出
5.恢复稀疏数组
System.out.println("恢复成稀疏数组");
int sum1=0;
int[][] sparseArr2 = new int[sb1.length/3][3];
sparseArr2[0][0]=Integer.parseInt(sb1[0]);
sparseArr2[0][1]=Integer.parseInt(sb1[1]);
sparseArr2[0][2]=Integer.parseInt(sb1[2]);
for (int i = 3; i < sb1.length; i+=3) {
sum1++;
sparseArr2[sum1][0]=Integer.parseInt(sb1[ i+0]);
sparseArr2[sum1][1]=Integer.parseInt(sb1[ i+1]);
sparseArr2[sum1][2]=Integer.parseInt(sb1[ i+2]);
}
System.out.println("还原后的稀疏数组为:");
for (int[] row:sparseArr2) {
for (int data :row) {
System.out.print(data+"\t");
}
System.out.println();
}
6.恢复原始二维数组
int[][] chessArr3 = new int[sparseArr2[0][0]][sparseArr2[0][1]];
for (int i = 1; i < sparseArr2.length; i++) {
chessArr3[sparseArr2[i][0]][sparseArr2[i][1]]=sparseArr2[i][2];
}
System.out.println("还原后的二维数组为:");
for (int[] row:chessArr3) {
for (int data :row) {
System.out.print(data+"\t");
}
System.out.println();
}
总结
学习了数据结构中线性结构–稀疏数组与二维数组的转换,以及存入磁盘与从磁盘读取。