二維數(shù)組的定義:本質(zhì)上是以數(shù)組為數(shù)組元素的數(shù)組,即 數(shù)組的數(shù)組
稀疏數(shù)組的誕生的大概背景:在傳統(tǒng)的二維數(shù)組存儲方式,會利用大量的存儲空間來存放0值(即默認值為0),從而浪費大量內(nèi)存,進行存儲時會浪費比較大的空間。
稀疏數(shù)組的定義:通過一個三元組的方式將非0數(shù)據(jù)保存到一個數(shù)組中。
代碼實現(xiàn)(Java代碼)
// 創(chuàng)建一個二維數(shù)組 6 * 6
// 在二維數(shù)組中存放三個數(shù)據(jù)
int[][] array = new int[6][6];
// 第2行第6列存放一個為66的數(shù)據(jù)
array[1][5] = 66;
// 第3行第3列存放一個為 99
array[2][2] = 99;
// 第6行第3列存放一個為88的數(shù)據(jù)
array[5][2] = 88;
輸出 二維數(shù)組的數(shù)據(jù)
for (int[] row : array) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}

二維數(shù)組 轉(zhuǎn) 稀疏數(shù)組
創(chuàng)建一個稀疏數(shù)組需要的條件
1)遍歷二維數(shù)組,獲取到 有效數(shù)據(jù)的個數(shù)(sum)
2)根據(jù)sum創(chuàng)建 稀疏數(shù)組 sparse int[ sum + 1 ][ 3 ]
// 獲取有效數(shù)據(jù)的個數(shù)
int sum = 0;
for (int[] row : array) {
for (int data : row) {
if( data != 0 ){
sum ++;
}
}
}
System.out.println("二維數(shù)組中有效的數(shù)據(jù)個數(shù)為:" + sum);
// 結(jié)果為:sum = 3
創(chuàng)建 稀疏數(shù)組
// 根據(jù)sum創(chuàng)建 稀疏數(shù)組
int [][] sparse = new int[sum + 1][3];
稀疏數(shù)組的第一行存儲二維數(shù)組的 行 與 列 和 有效數(shù)據(jù)的個數(shù)
// 第一行存放 二維數(shù)組的行與列和有效數(shù)據(jù)的個數(shù)
sparse[0][0] = array.length; sparse[0][1] = array[0].length; sparse[0][2] = sum;
稀疏數(shù)組的第N行(N != 0 && N > 0 )存儲 有效數(shù)據(jù) 在二維數(shù)組中的位置
// 用于記錄
int count = 0;
// row
for (int i = 0; i < array.length; i++) {
// data
for (int j = 0; j < array[i].length; j++) {
if( array[i][j] != 0 ){
count ++;
sparse[count][0] = i;
sparse[count][1] = j;
sparse[count][2] = array[i][j];
}
}
}
輸出 稀疏數(shù)組的數(shù)據(jù)

二維數(shù)組數(shù)據(jù) 與 稀疏數(shù)組數(shù)據(jù)進行校驗

稀疏數(shù)組 轉(zhuǎn) 二維數(shù)組
// 根據(jù) 稀疏數(shù)組的第一行 存儲二維數(shù)組的行數(shù)與列數(shù)來創(chuàng)建一個新的二維數(shù)組
int [][] array2 = new int[sparse[0][0]][sparse[0][1]];
將稀疏數(shù)組的第N行(N != 0 && N > 0 )存儲的有效數(shù)據(jù) 賦值給 array2 二維數(shù)組
// row
for (int i = 1; i < sparse.length; i++) {
// data
for (int j = 0; j < sparse[i].length; j++) {
array2[sparse[i][0]][sparse[i][1]] = sparse[i][j];
}
}
輸出 二維數(shù)組 array2 的數(shù)據(jù)
for (int[] row : array2) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}

本次案例的完整案例代碼如下:
// 創(chuàng)建一個二維數(shù)組 6 * 6
// 在二維數(shù)組中存放兩個數(shù)據(jù)
int[][] array = new int[6][6];
// 第2行第6列存放一個為66的數(shù)據(jù)
array[1][5] = 66;
// 第3行第3列存放一個為 99
array[2][2] = 99;
// 第6行第3列存放一個為88的數(shù)據(jù)
array[5][2] = 88;
//輸出
// 記錄二維數(shù)組中有幾個有效的數(shù)值
int sum = 0;
for (int[] row : array) {
for (int data : row) {
System.out.print(data + "\t");
if( data != 0 ){
sum ++;
}
}
System.out.println();
}
System.out.println();
System.out.println("二維數(shù)組中有效的數(shù)據(jù)個數(shù)為:" + sum);
// 創(chuàng)建一個 稀疏數(shù)組 的前提條件(需要知道二維數(shù)組中有效的數(shù)據(jù)個數(shù))
// 1、遍歷二維數(shù)組,獲取到有效數(shù)據(jù)的個數(shù)(sum)
// 2、根據(jù)sum創(chuàng)建 稀疏數(shù)組
int [][] sparse = new int[sum + 1][3];
// 第一行存放 二維數(shù)組的行與列和有效數(shù)據(jù)的個數(shù)
sparse[0][0] = array.length;sparse[0][1] = array[0].length;sparse[0][2] = sum;
// 用于記錄
int count = 0;
// row
for (int i = 0; i < array.length; i++) {
// data
for (int j = 0; j < array[i].length; j++) {
if( array[i][j] != 0 ){
count ++;
sparse[count][0] = i;
sparse[count][1] = j;
sparse[count][2] = array[i][j];
}
}
}
// 輸出 稀疏數(shù)組
for (int[] ros : sparse) {
for (int data : ros) {
System.out.print(data + "\t");
}
System.out.println();
}
System.out.println();
System.out.println();
// 稀疏數(shù)組轉(zhuǎn)二維數(shù)組
int [][] array2 = new int[sparse[0][0]][sparse[0][1]];
// row
for (int i = 1; i < sparse.length; i++) {
// data
for (int j = 0; j < sparse[i].length; j++) {
array2[sparse[i][0]][sparse[i][1]] = sparse[i][j];
}
}
// 輸出二維數(shù)組
for (int[] row : array2) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}