浅谈:稀疏数组与二维数组之间的转换
生活随笔
收集整理的這篇文章主要介紹了
浅谈:稀疏数组与二维数组之间的转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習筆記
二維數組簡介
二維數組本質上是以數組作為數組元素的數組,即“數組的數組”,類型說明符 數組名[常量表達式][常量表達式]。二維數組又稱為矩陣,行列數相等的矩陣稱為方陣。對稱矩陣a[i][j] = a[j][i],對角矩陣:n階方陣主對角線外都是零元素。
二維數組
二維數組類似于五子棋的棋盤
引入稀疏數組
假如我們有二維數組,需要保存,發現上面的數據有很多數據是無效的數據,有效數據只有2個
這樣保存下來會有很多的無效數據,假如無效數據過于龐大,會大大的影響網絡傳輸效率等,所以就可以通過稀疏數組來讓無效的數據消失.
代碼解析(詳細解釋在代碼注釋中,二維數組轉稀疏數組轉二維數組)
package com.fs.demo01; /* 稀疏數組 將原本二維數組多余的數據去除,保留原本的有效數據,降低數據的大小,提升效率*/ public class SparseArray {public static void main(String[] args) {//創建二維數組,來表示棋盤//0表示棋盤的點,1表示黑子,2表示藍子int doubleArray[][] = new int[11][11];//給第2排的第3列放上一個黑子(行列從索引0開始)doubleArray[1][2] = 1;//給第三排的第4列放上一個藍子doubleArray[2][3] = 2;//輸出一下二維數組//循環遍歷兩次,因為二維數組是兩個一維數組合成System.out.println("原始二維數組棋盤----------------------------");for (int[] ints : doubleArray) {for (int anInt : ints) {//排版一下System.out.printf("\t"+anInt);}//換行System.out.println();}System.out.println("將二維數組轉成稀疏數組------------------------");//先遍歷二維數組中數據非0 的個數//定義一個變量保存非0的個數int sum = 0;for (int i = 0; i < doubleArray.length; i++) {int[] ints = doubleArray[i];for (int j = 0; j < ints.length; j++) {int anInt = ints[j];if (anInt!=0){sum++;}}}System.out.println("二維數組中已經存放的棋子個數為:"+sum);/*** 對應我們上面的二維數組* 稀疏數組格式* 對應二維數組的行 對應二維數組的列 對應的值* 第一行是二維數組的格式 11(二維數組行) 11(二維數組列) 2(有效值)* 后面的就是對應二維數組的 1 2 1* 實際坐標 2 3 2*** 打印結果:* 11 11 2* 1 2 1* 2 3 2*///創建稀疏數組 行為sum+1,因為有一個二維數據數據行 列永遠是三int sparseArray[][] = new int[sum+1][3];//給稀疏數組的行列復制sparseArray[0][0] = doubleArray.length;//第一行第一列sparseArray[0][1] = doubleArray.length;//第一行第二列sparseArray[0][2] = sum;//第一行第三列//遍歷二維數組,當二維數組有值得時候記錄坐標,將值賦值給稀疏數組//定義一個變量來存儲當前是洗漱數組的第幾行int row = 1;//稀疏數組從第二行開始,因為第1行存放了二維數組的數據for (int i = 0; i < doubleArray.length; i++) {int[] ints = doubleArray[i];for (int j = 0; j < ints.length; j++) {int anInt = ints[j];if (anInt!=0){sparseArray[row][0] = i;//row行的第1列存檔有數據的行sparseArray[row][1] = j;//row行的第二列存放二維數組有數據的列sparseArray[row][2] = doubleArray[i][j];//row行的第三列存放有數據的二維數組本身的值row++;//存放完加一行}}}//循環遍歷打印一下稀疏數組for (int[] ints : sparseArray) {for (int anInt : ints) {//排版一下System.out.printf("\t"+anInt);}//換行System.out.println();}System.out.println("將稀疏數組恢復成二維數組-----------------------");/*** 在將稀疏數組恢復成二維數組* 1.先讀取稀疏數組的第一行數據,根據第一行數據恢復原來的二維數組平面* 2.然后讀取稀疏數組的第二行后的數據,第二行的第一列就是有效值在二維數組的行,第二行的第二列就是有效值在二維數組的列,第二行的第三列就是有效值**///創建恢復的二維數組.sparseArray[0][1]==11 sparseArray[0][2]==11int doubleArrayNew[][] = new int[sparseArray[0][0]][sparseArray[0][1]];//循環稀疏數組,從第二行開始,將行列賦值在新的二維數組中for (int i = 1; i < sparseArray.length; i++) {/*對應稀疏數組的形態來看11 11 21 2 12 3 2循環第一次的時候sparseArray[i][0] = 1 sparseArray[i][1]=2 sparseArray[i][2]=1循環第二次的時候sparseArray[i][0] = 2 sparseArray[i][1]=3 sparseArray[i][2]=2*/doubleArrayNew[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}//打印一下新的二維數組,看打印結果是否和原來的一樣for (int[] ints : doubleArrayNew) {for (int anInt : ints) {//排版一下System.out.printf("\t"+anInt);}//換行System.out.println();}} }執行結果
總結
以上是生活随笔為你收集整理的浅谈:稀疏数组与二维数组之间的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用POI技术简单的将数据库中的数据读取
- 下一篇: 队列与环形队列使用数组模拟