最近工作中用到了稀疏数组,怕忘记了,做下笔记。
稀疏数组含义:
他是一个N行3列的一个数值,当一个二位数组有大部分数据为空数据时,可以压缩压缩记录有效数据的位置,从而形成一个占据内存小的稀疏数组
举个栗子
image.png有这一个88的表格,我们可以看做他是一个棋盘,1代表黑棋2代表白旗,没有下棋子的地方为0,那么我们保存游戏的时候,就要把整个二维数组保存,也就88=64格。那么有什么办法减小保存的数量吗?答案就是稀疏数组。
那么上面的表格转稀疏数组是什么样呢?
如图所示:
稀疏数组的第一行一次代表的是:二维数组的行数,列数,有效数字个数
后面的行中数据格式一次代表:有效数字所在的行数 ,列数 ,具体值。
自己根据上面的棋盘对一对,是不是呢?
然后我们写个工具类,直接上代码了。
public class SparseArrayTool {
/**
* 存入一个二维数组,返回一个稀疏数组
* @param args
*/
public static int[][] getSparseArray(int args[][],int rows,int clos){
int sum = 0;//记录有多少个非0的有效数据
//得到稀疏数组
for (int[] row : args) {
for (int item : row) {
if(item!=0){
sum+=1;
}
}
}
//稀疏数组固定3列,第一行固定表示二维数组的 长 宽 有效个数,后面是具体记录,所以要行数加一
int sparseArgs [][] = new int [sum+1][3];
//完成稀疏数组第一列
sparseArgs[0][0] = rows;
sparseArgs[0][1] = clos;
sparseArgs[0][2] = sum;
int count = 0;//稀疏数组从第二列才是记录
for(int x=0;x<rows;x++){
count+=1;
for(int y = 0;y<clos;y++){
if(args[x][y] != 0){
//存入
sparseArgs[count][0] = x;
sparseArgs[count][1] = y;
sparseArgs[count][2] = args[x][y];
}
}
}
//保存稀疏数组
saveSparseArray(sparseArgs,"c:\\ALL PROJECT\\array.txt");
return sparseArgs;
}
public static void saveSparseArray(int[][] sparseArgs, String path){
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(path);
for (int[] row : sparseArgs) {
for (int item : row) {
fileWriter.write(item+"&&");
}
fileWriter.write("\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fileWriter!=null){
try {
fileWriter.close();
fileWriter = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 一个稀疏数组文件,我们不知道他的长度的情况下,要先通过io得到他的行数。
* @param path
* @return
*/
public static int getSparseArrayFileRows(String path){
File file = new File(path);
if(!file.exists()){
return 0;
}
BufferedReader bufferedReader = null;
int row = 0;
try {
bufferedReader = new BufferedReader(new FileReader(file));
String line = null;
//先来为了测出行数
while((line = bufferedReader.readLine())!=null){
row+=1;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(bufferedReader!=null){
try {
bufferedReader.close();
bufferedReader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return row;
}
/**
* 读取稀疏数组文件,转化为数组
* @param path
*/
public static int [][] openSparseArrayFile(String path) {
File file = new File(path);
if(!file.exists()){
return null;
}
int fileRows = getSparseArrayFileRows(path);
int args[][]=new int[fileRows][3];
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(file));
//取值
int row = 0;
String line = null;
while((line = bufferedReader.readLine())!=null){
String[] temp = line.split("&&");
for(int j=0;j<temp.length;j++){
args[row][j] = Integer.parseInt(temp[j]);
}
row+=1;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(bufferedReader!=null){
try {
bufferedReader.close();
bufferedReader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return args;
}
/**
* 拿到一个稀疏数组转为普通二维数组
* @param sparseArray
* @return
*/
public static int[][] getTwoArray(int[][] sparseArray,int rows,int clos) {
int[][] args = new int[rows][clos];
for (int r = 1;r<sparseArray.length;r++) {
// for (int l = 0;l<sparseArray[r].length;l++) {
//
// }
args[sparseArray[r][0]][sparseArray[r][1]] = sparseArray[r][2];
}
return args;
}
}
测试下:
二维数组转稀疏数组,并且存到file文件中
public static void main(String ar[]) {
//创建一个二维数组,并放入一些数据
int args[][] = new int [11][11];
args[0][0] = 1;
args[1][1] = 2;
args[2][1] = 1;
for (int[] row : args) {
for (int i : row) {
System.out.print(" "+i);
}
System.out.println();
}
int[][] sparseArray = SparseArrayTool.getSparseArray(args, 11, 11);
System.out.println("稀疏数组---------");
for (int[] row : sparseArray) {
for (int i : row) {
System.out.print(" "+i);
}
System.out.println();
}
}
image.png
稀疏数组的file文件转为普通二维数组
public static void main(String ar[]) {
//读取稀疏数组文件,转化为数组
int[][] sparseArray = SparseArrayTool.openSparseArrayFile("c:\\ALL PROJECT\\array.txt");
System.out.println("稀疏数组---------");
for (int[] row : sparseArray) {
for (int i : row) {
System.out.print(" " + i);
}
System.out.println();
}
System.out.println("普通数组---------");
int args[][] = SparseArrayTool.getTwoArray(sparseArray,11,11);
for (int[] row : args) {
for (int i : row) {
System.out.print(" "+i);
}
System.out.println();
}
}
image.png
网友评论