数据结构:稀疏数组的存储

避免部分同学不懂什么是稀疏数组,这里介绍一下稀疏数组

思路:
遍历原来的数组,记录下来元素的有效数据个数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();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值