稀疏数组
基本介绍
? 当一个数组大部分元素为0,或者为同一个值时,可以使用稀疏数组来保存该数组
? 稀疏数组:总是行不确定,但列是3列的动态数组
? 稀疏数组的处理方法是:
? 1)记录数组有几行几列,有多少个不同值
? 2)把具有不同值的元素的行列及值记录在一个小规模的数组(稀疏数组)中,从而缩小程序的规模
? 应用场景:编写五子棋程序中
?
? 分析问题:
? 因为该二维数组的很多值都是默认为0,因此记录了很多没有意义的数据----->稀疏数组
二维数组转为稀疏数组的思路
? 1)遍历原始的二维数组,得到要保存的有效数据的个数sum
? 2)根据sum就可以创建稀疏数组sparseArr int[sum + 1][3]
? 3)将二维数组的有效数据存入稀疏数组
稀疏数组转为原始二维数组
? 1)先读取稀疏数组的第一行,根据第一行数据,创建原始数组
? 2)在读取稀疏数组后面的数据,并赋值给二维数组即可
package com.cwnu.sparseArray;
import java.io.*;
public class SparseArray {
public static void main(String[] args) throws IOException {
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][2] = 1;
chessArr1[1][6] = 2;
chessArr1[7][3] = 1;
chessArr1[2][6] = 2;
chessArr1[3][9] = 1;
chessArr1[2][1] = 2;
for (int[] row :chessArr1){
for (int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
int sum = 0;
for (int i = 0;i < 11; i++){
for (int j = 0;j < 11; j++){
if (chessArr1[i][j] !=0){
sum++;
}
}
}
System.out.println("sum = " + 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 (chessArr1[i][j] !=0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArr1[i][j];
}
}
}
System.out.println();
System.out.println("得到的稀疏数组:");
for (int i = 0;i < sparseArray.length;i++){
System.out.printf("%d\t%d\t%d",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
System.out.println();
}
inputFile(sparseArray);
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];
}
System.out.println("恢复后的二维数组");
for (int[] row :chessArr2){
for (int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
public static void inputFile(int[][] arr) throws IOException {
String str = "E:/sparseArray.txt";
File file = new File(str);
if (!file.exists()){
file.createNewFile();
}
FileWriter fileWriter = new FileWriter(str);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
fileWriter.write(arr[i][j]+"\t");
}
fileWriter.write("\r\n");
}
fileWriter.close();
}
public static int[][] readFile(String fileName) throws IOException {
File file = new File(fileName);
BufferedReader in = new BufferedReader(new FileReader(file));
int row2 = 0;
int sparseArr[][] = new int[5][3];
String line;
while ((line = in.readLine()) != null) {
String[] temp = line.split("\t");
for (int i = 0; i < temp.length; i++) {
sparseArr[row2][i] = Integer.parseInt(temp[i]);
}
row2++;
}
return sparseArr;
}
}
|