1.1 稀疏數組
實際問題
實際案例:編寫的五子棋程序中,有和續上盤的功能。
存在問題:
因爲該二維數組的很多值是默認值0, 因此記錄了很多沒有意義的數據->稀疏數組。
什麼是稀疏數組
當一個數組中大部分元素爲0,或者爲同一個值的數組時,可以使用稀疏數組來保存該數組。
稀疏數組的處理方法是:
- 記錄數組一共有幾行幾列,有多少個不同的值
- 把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模
轉換邏輯
二維數組轉稀疏數組的思路
1.遍歷原始的二維數組,得到有效數據的個數sum
2.根據sum就可以創建稀疏數組sparseArray= int[sum+ 1][3]
3.將二維數組的有效數據數據存入到稀疏數組
稀疏數組轉原始的二維數組的思路
1.先讀取稀疏數組的第-行,根據第一行的數據,創建原始的二維數組,比如下面的chessArr2 =int[6][7]
2.在讀取稀疏數組後幾行的數據,並賦給原始的二維數組即可.
Java代碼實現
二維數組轉換爲稀疏數組
/**
* 二維數組轉換爲稀疏數組
* @param sourceArray 原始的二維數組
* @return 轉換後的稀疏數組
*/
public static int[][] array2SparseArray(int[][] sourceArray){
if (sourceArray == null) {
return null;
}
//用來保存有效數字的個數
int significantNumber = 0;
//保存數組的行號
int rowCount = sourceArray.length;
int colCount = 0;
//遍歷數組獲取有效數字的個數
for(int row = 0;row<rowCount;row++){
colCount = sourceArray[row].length;
for(int col = 0;col<colCount;col++){
//判斷是否爲有效數字,增加有效數字的個數
if(sourceArray[row][col]!=0){
significantNumber++;
}
}
}
//初始化轉換後的稀疏數組
int[][] sparseArray = new int[significantNumber + 1][3];
//稀疏數組的第一行的第一個值爲原數組行數
sparseArray[0][0] = rowCount;
//稀疏數組的第一行的第二個值爲原數組列數
sparseArray[0][1] = colCount;
//稀疏數組的第一行的第三個值爲原數組的有效數字的個數
sparseArray[0][2] = significantNumber;
//記錄第幾個有效數字
int count = 0;
for(int row = 0;row<rowCount;row++){
colCount = sourceArray[row].length;
for(int col = 0;col<colCount;col++){
//判斷是否爲有效數字,記錄有效數字的位置和具體值
if(sourceArray[row][col]!=0){
count++;
sparseArray[count][0] = row;
sparseArray[count][1] = col;
sparseArray[count][2] = sourceArray[row][col];
}
}
}
return sparseArray;
}
稀疏數組轉化爲原數組
/**
* 稀疏數組轉化爲原數組
* @param sparseArray 稀疏數組
* @return 原數組
*/
public static int[][] sparseArray2Array(int[][] sparseArray){
if (sparseArray == null) {
return null;
}
int row = sparseArray[0][0];
int col = sparseArray[0][1];
int num = sparseArray[0][2];
int[][] sourceArray = new int[row][col];
//初始化原數組信息
for(int i = 1;i<=num;i++){
sourceArray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
return sourceArray;
}
打印數組的方法
/**
* 給定數組打印其結構
* @param array 需要打印的數組
*/
private static void showArray(int [][] array){
if (array == null) {
System.out.print("打印數字不能爲空!");
}
for(int[] rowData: Objects.requireNonNull(array)){
for(int colData:rowData){
System.out.print(colData+"\t");
}
System.out.println();
}
}
測試方法
public static void main(String[] args) {
int[][] sourceArray = new int[6][7];
sourceArray[0][0]=2;
sourceArray[5][3]=2;
sourceArray[4][3]=2;
sourceArray[3][4]=2;
System.out.println("轉換前的數組爲:");
//轉換前的數組
SparseArray.showArray(sourceArray);
sourceArray = SparseArray.array2SparseArray(sourceArray);
System.out.println("轉換後的數組爲:");
//轉換後的稀疏數組
SparseArray.showArray(sourceArray);
System.out.println("重新hryr後的數組爲:");
sourceArray = SparseArray.sparseArray2Array(sourceArray);
SparseArray.showArray(sourceArray);
}