避免部分同学不懂什么是稀疏数组,这里介绍一下稀疏数组
思路:
遍历原来的数组,记录下来元素的有效数据个数sum
创建一个矩阵 int[sun+1][3]第一行记录元素的行数,列数和sum
后面的每一行记录的是有效数据的位置(行,列,值)
然后保存这个新创建的数组
恢复:
读取保存的文件,然后得到原始数组有几行几列,几个有效值
然后创建数组,将有效值回归到原位
package begin;
import java.util.*;
import java.io.*;
public class one {
public static void main(String[]args) throws IOException{
final int qwe=11;
Scanner attain=new Scanner(System.in);
int max,hang,lie;
int[][] data=new int[qwe][qwe];
System.out.println("请输入稀疏数组内有几个值:");
max=attain.nextInt();
System.out.println("请输入元素的横坐标,纵坐标,值");
for(int i=0;i<max;i++) {
hang=attain.nextInt();
lie=attain.nextInt();
data[hang][lie]=attain.nextInt();
}
attain.close();
System.out.println("稀疏矩阵创建成功:");
appear(data);
max=gain(data);
int[][] code=new int[max+1][3];
int[][] codes=new int[max+1][3];
code=over(data,max);
System.out.println("压缩矩阵:");
appear(code);
handwrite(code);
codes=handread();
System.out.println("读取成功,读取到的矩阵为:");
appear(codes);
int[][] datas=action(codes);
System.out.println("读取成功,解压后矩阵为:");
appear(datas);
}
static int[][] action(int[][] code){
int x=code[0][0];
int y=code[0][1];
int z=code[0][2];
int[][] datas=new int[x][y];
for(int i=1;i<=z;i++)
datas[code[i][0]][code[i][1]]=code[i][2];
return datas;
}
static int gain(int[][] data){
int max=0;
for(int i[] :data)
for(int ii : i)
if(ii!=0)
max++;
return max;
}
static int[][] over(int[][] data,int max){
int[][] code=new int[max+1][3];
code[0][0]=data.length;code[0][1]=data[1].length;code[0][2]=max;
int qwe=1;
for(int i=0;i<code[0][0];i++)
for(int j=0;j<code[0][1];j++)
if(data[i][j]!=0) {
code[qwe][0]=i;
code[qwe][1]=j;
code[qwe][2]=data[i][j];
qwe++;
}
return code;
}
static void handwrite(int[][] code) throws IOException {
FileWriter fw=new FileWriter("E:/Java代码/data.data");
for(int[] i:code) {
for(int ii:i)
fw.write(ii+" ");
fw.write("\n");
}
fw.close();
}
static int[][] handread() throws IOException{
FileReader rw=new FileReader("E:/Java代码/data.data");
char[] datas=new char[300];
LinkedList<Integer> cunchu=new LinkedList<Integer>();
int asd=rw.read(datas);
String str=new String(datas,0,asd);
rw.close();
//将字符串转化为二维数组
for(int i=0;i<str.length();) {
int j=i;
while(!str.substring(i, i+1).equals(" ")&&!str.substring(i, i+1).equals("\n"))
if(i<str.length()-1)
i++;
if(i>j) {
Integer data=new Integer(str.substring(j, i));
cunchu.add(data);
}
else
i++;
}
int[][] codes=new int[cunchu.get(2)+1][3];
for(int i=0;i<(cunchu.get(2)+1);i++) {
codes[i][0]=cunchu.get(3*i);
codes[i][1]=cunchu.get(3*i+1);
codes[i][2]=cunchu.get(3*i+2);
}
return codes;
}
public static void appear(int[][] data) {
for(int i[]:data) {
for(int ii:i)
System.out.print(ii + " ");
System.out.println();
}
}
}