Java版二维数组<==>稀疏数组
稀疏数组
1.应用场景
当一个数组中的元素大部分为0或者为同一个值的数组时,可以用稀疏数组来保存该数组
2.稀疏数组的处理方法
- 记录数组有几行几列,有几个不同的元素
- 把具有不同值的元素的行列和值记录在一个规模较小的数组中,缩小程序的规模
注:稀疏数组的第一行元素值分别为:原始数组的行数,列数和有效元素个数
3.二维数组<—>稀疏数组
3.1二维数组—>稀疏数组
创建原始数组
int[][] arr= new int[11][11];
arr[2][7]=1;
arr[5][3]=2;
arr[7][5]=3;
- 遍历原始的二维数组,得到有效数据的个数
public static int getElementCount(int[][]a){
int sum=0;
for (int[] ints : a) {
for (int j = 0; j < a[0].length; j++) {
if (ints[j] != 0) {
sum++;
}
}
}
return sum;
}
- 根据个数确定稀释数组的行数创建稀疏数组,并将有效元素存储到该数组中
public static int[][] getSparseArr(int sum,int[][] arr){
int[][] sparseArr=new int[sum+1][3];
// 将原数组的行数,列数和有效元素的个数赋值给稀疏数组的第一行
sparseArr[0][0]=arr.length;
sparseArr[0][1]=arr[0].length;
sparseArr[0][2]=sum;
// 稀疏数组一行从左到右为有效元素的行号,列号,值,z用来记录该值为在稀疏数组的第几行
int z=1;
// 将有效元素赋值给稀疏数组
for (int i = 0; i < arr.length ; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (arr[i][j] != 0){
sparseArr[z][0] = i;
sparseArr[z][1] = j;
sparseArr[z][2] = arr[i][j];
z++;
}
}
}
return sparseArr;
}
- 用stream流打印稀疏数组
// 用stream流打印二维数组,用stream流的of方法,把二维数组转换成一维数组
// (一维数组a的元素是一维数组b,b数组元素是稀疏数组中一行的元素)
// [11, 11, 3]
// [2, 7, 1]
// [5, 3, 2]
// [7, 5, 3]
Stream.of(sparseArr).forEach(t->System.out.println(Arrays.toString(t)));
3.1稀疏数组—>文件
public static void putSparseArrInFile(int[][]a , String path){
FileWriter fw=null;
try {
fw=new FileWriter("a.txt");
for (int[] ints : a) {
for (int anInt : ints) {
fw.write(anInt +" ");
}
fw.write("\n");
}
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
assert fw != null;
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.3文件—>稀疏数组
public static int[][] getSparseArrFromFile(String path){
BufferedReader br=null;
int[][] sparseArr1 ;
try {
br=new BufferedReader(new FileReader(path));
int sparseArrLength =0;
while (br.readLine() !=null){
sparseArrLength++;
}
// 注意:这里的流已经将将整个文件读完了,所以要关闭该流,不然后面读出的为空
br.close();
// 现在重新打开流
br=new BufferedReader(new FileReader(path));
sparseArr1=new int[sparseArrLength][3];
String len="";
int hang=0;
while ((len=br.readLine())!=null){
String[] s = len.split(" ");
sparseArr1[hang][0]=Integer.parseInt(s[0]);
sparseArr1[hang][1]=Integer.parseInt(s[1]);
sparseArr1[hang][2]=Integer.parseInt(s[2]);
hang++;
}
return sparseArr1;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return new int[0][0];
}
}
3.4稀疏数组—>二维数组
// 把稀疏数组转换成二维数组
int[][] arr1=new int[sparseArr[0][0]] [sparseArr[0][1]] ;
for (int i = 1; i < sparseArr.length; i++) {
arr1[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
4.完整代码
import java.io.*;
import java.util.Arrays;
import java.util.stream.Stream;
/**
* @author 86147
* @ClassName : PACKAGE_NAME.sparseArr
* @Description : 类描述
* Created by user on 2021-06-24 22:53:04
* Copyright 2020 user. All rights reserved.
*/
public class SparseArr {
public static void main(String[] args) {
int[][] arr= new int[11][11];
arr[2][7]=1;
arr[5][3]=2;
arr[7][5]=3;
// 确定有效元素的个数
int sum = getElementCount(arr);
// 根据有效元素个数创建稀疏数组
int[][] sparseArr = getSparseArr(sum, arr);
// 用stream流打印二维数组,用stream流的of方法,把二维数组转换成一维数组
// (一维数组a的元素是一维数组b,b数组元素是稀疏数组中一行的元素)
// [11, 11, 3]
// [2, 7, 1]
// [5, 3, 2]
// [7, 5, 3]
Stream.of(sparseArr).forEach(t->System.out.println(Arrays.toString(t)));
// 将稀疏数组写入文件
putSparseArrInFile(sparseArr,"a.txt");
// 将稀疏数组从文件中读取出来
int[][] sparseArrOnFile = getSparseArrFromFile("a.txt");
Stream.of(sparseArrOnFile).forEach(t->System.out.println(Arrays.toString(t)));
// 把稀疏数组转换成二维数组
int[][] arr1=new int[sparseArr[0][0]] [sparseArr[0][1]] ;
for (int i = 1; i < sparseArr.length; i++) {
arr1[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Stream.of(arr1).forEach(t->System.out.println(Arrays.toString(t)));
}
public static int getElementCount(int[][]a){
int sum=0;
for (int[] ints : a) {
for (int j = 0; j < a[0].length; j++) {
if (ints[j] != 0) {
sum++;
}
}
}
return sum;
}
public static int[][] getSparseArr(int sum,int[][] arr){
int[][] sparseArr=new int[sum+1][3];
// 将原数组的行数,列数和有效元素的个数赋值给稀疏数组的第一行
sparseArr[0][0]=arr.length;
sparseArr[0][1]=arr[0].length;
sparseArr[0][2]=sum;
// 稀疏数组一行从左到右为有效元素的行号,列号,值,z用来记录该值为在稀疏数组的第几行
int z=1;
// 将有效元素赋值给稀疏数组
for (int i = 0; i < arr.length ; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (arr[i][j] != 0){
sparseArr[z][0] = i;
sparseArr[z][1] = j;
sparseArr[z][2] = arr[i][j];
z++;
}
}
}
return sparseArr;
}
public static void putSparseArrInFile(int[][]a , String path){
FileWriter fw=null;
try {
fw=new FileWriter("a.txt");
for (int[] ints : a) {
for (int anInt : ints) {
fw.write(anInt +" ");
}
fw.write("\n");
}
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
assert fw != null;
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//
public static int[][] getSparseArrFromFile(String path){
BufferedReader br=null;
int[][] sparseArr1 ;
try {
br=new BufferedReader(new FileReader(path));
int sparseArrLength =0;
while (br.readLine() !=null){
sparseArrLength++;
}
// 注意:这里的流已经将将整个文件读完了,所以要关闭该流,不然后面读出的为空
br.close();
// 现在重新打开流
br=new BufferedReader(new FileReader(path));
sparseArr1=new int[sparseArrLength][3];
String len="";
int hang=0;
while ((len=br.readLine())!=null){
String[] s = len.split(" ");
sparseArr1[hang][0]=Integer.parseInt(s[0]);
sparseArr1[hang][1]=Integer.parseInt(s[1]);
sparseArr1[hang][2]=Integer.parseInt(s[2]);
hang++;
}
return sparseArr1;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return new int[0][0];
}
}