数据结构(1):稀疏数组使用java实现
主要是用于数组压缩,去除无效的数组内容:
原数组内容:
0 0 0 0 0
0 1 0 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
转换成
稀疏数组
5 5 2
1 1 1
2 3 2
思路:

韩老师留的最后课后作业代码完成:
代码实现:
package Array_Test;
import java.io.*;
public class Test4 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
writeFile("/Users/maniac/Sparse.txt");
readFile("/Users/maniac/Sparse.txt");
}
public static void readFile(String filename) throws IOException, ClassNotFoundException {
File file =new File(filename);
FileInputStream fileInputStream =new FileInputStream(file);
ObjectInputStream objectInputStream =new ObjectInputStream(fileInputStream);
int[][] data = (int[][]) objectInputStream.readObject();
System.out.println("反序列化:");
for(int i=0;i<data.length;i++){
for(int j=0;j<data[i].length;j++){
System.out.printf("%d\t",data[i][j]);
}
System.out.println();
}
//还原成二维数组
int[][] array = new int[data[0][0]][data[0][1]];
//输出默认数组 5x5:
System.out.println("默认数组:");
for(int d[]:array){
for(int t:d){
System.out.printf("%d\t",t);
}
System.out.println();
}
//稀疏数组赋值给二维数组
//赋值不需要稀疏数组第一行数据去除掉,从第二行开始。
//列是固定的
for(int i=1;i<data.length;i++){
//data[i][0] = 1,2
//data[i][1] = 1,3
//data[i][2] = 1,2 结果
//相当于 1-1 2-3
array[data[i][0]][data[i][1]] = data[i][2];
}
//输出二维数组
System.out.println("稀疏数组还原二维数组:");
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
System.out.printf("%d\t",array[i][j]);
}
System.out.println();
}
}
public static void writeFile(String filename) throws IOException {
int[][] data =new int[5][5];
data[1][1] = 1;
data[2][3] = 2;
System.out.println("原数组内容:");
for(int d[]:data){
for(int t:d){
System.out.printf("%d\t",t);
}
System.out.println();
}
// 原数组转稀疏数据
// 获取有效原数组数据
int sum = 0;
for(int i=0;i<data.length;i++){
for(int j=0;j<data[i].length;j++){
if(data[i][j]!=0){
sum++;
}
}
}
System.out.println("二维数组有效数据有"+sum+"个");
int[][] array2 = new int[sum+1][3];
//已知稀疏数组固定3列
array2[0][0] = data.length;
array2[0][1] = data.length;
array2[0][2] = sum;
//把二维数组赋值给稀疏数组
int num =0 ;
for(int i=0;i<data.length;i++){
for(int j=0;j<data[i].length;j++){
if(data[i][j]!=0){
num++;
//第一行已经设置好内容,从第二行开始就是1开始赋值
array2[num][0]=i;
array2[num][1]=j;
//把原始数组中存在的内容赋值给第三列数据
array2[num][2]=data[i][j];
}
}
}
System.out.println("输出稀疏数组内容:");
for(int i=0;i<array2.length;i++){
for(int j=0;j<array2[i].length;j++){
System.out.printf("%d\t",array2[i][j]);
}
System.out.println();
}
//序列化数组对象
File file =new File(filename);
ObjectOutputStream objectOutputStream =new ObjectOutputStream(new FileOutputStream(file));
objectOutputStream.writeObject(array2);
objectOutputStream.close();
}
}
输出:
原数组内容:
0 0 0 0 0
0 1 0 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
二维数组有效数据有2个
输出稀疏数组内容:
5 5 2
1 1 1
2 3 2
反序列化:
5 5 2
1 1 1
2 3 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 0
0 1 0 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
java数组即对象:
package Array_Test;public class Test {
public static void main(String[] args) {
//数组的父类是Object
int[] a=new int[8];
String[] data = new String[8];
Object b = a;
Object[] c=data;
int length = a.length;
if(b instanceof int[]){
System.out.println("obj的真实类型是int[]");
}
//Object类内置方法
// a.hashCode();
System.out.println(length);
System.out.println(a.getClass().getName());
System.out.println(a.getClass().getSuperclass().getName());
Father.Son son =new Father.Son();
Father.Son[] sons =new Father.Son[8];
Father.Father2[] fa = sons;
System.out.println(sons.getClass().getSuperclass().getName());
}
}

package Array_Test; import java.io.*;
import java.util.Arrays; public class Test2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// writeFile("/Users/maniac/array1.txt");
readFile("/Users/maniac/array1.txt");
} public static void readFile(String filename) throws IOException, ClassNotFoundException {
FileInputStream fileInputStream =new FileInputStream(new File(filename));
ObjectInputStream objectInputStream =new ObjectInputStream(fileInputStream);
int[] d= (int[]) objectInputStream.readObject();
System.out.println(d.length);
System.out.println(Arrays.toString(d));
} public static void writeFile(String filename) throws IOException {
int[] data =new int[8];
data[0]=1;
FileOutputStream fileOutputStream =new FileOutputStream(new File(filename));
ObjectOutputStream objectOutputStream =new ObjectOutputStream(fileOutputStream);
// 序列化数组对象
objectOutputStream.writeObject(data);
objectOutputStream.close(); }
}

参考:韩顺平java数据结构和算法
数据结构(1):稀疏数组使用java实现的更多相关文章
- 图解Java数据结构之稀疏数组
在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...
- Java数据结构之稀疏数组(Sparse Array)
1.需求 编写的五子棋程序中,有存盘退出和续上盘的功能.因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,为了压缩存储所以采用稀疏数组. 2.基本介绍 当一个数组中大部分元素为0,或者为 ...
- golang数据结构之稀疏数组
掌握知识: 数组的初始化和赋值 结构体的初始化和赋值 字符串和整型之间的转换以及其它的一些操作 类型断言 读取文件 写入文件 对稀疏数组进行压缩 package main import ( " ...
- 稀疏数组(java实现)
1.稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.1记录数组一共有几行几列,有多少个不同的值 1.2把具有不同值的元素的行列 ...
- 02稀疏数组(java版本)
1 package com.aixuexi.contact; 2 3 public class SpareArray { 4 public static void main(String[] args ...
- Java的稀疏数组的简单代码实现
目录 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 二.稀疏数组的Java代码实现思路 三.稀释数组的Java代码实现 四.结语 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 ...
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
- 【学习总结】java数据结构和算法-第三章-稀疏数组和队列
相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...
- Java成神之路:第二帖---- 数据结构与算法之稀疏数组
数据结构与算法--稀疏数组 转换方法 记录数组有几行几列,有多少个不同的值 把不同的值的元素的行列,记录在一个小规模的数组中,以此来缩小数组的规模 如图: 二维数组转稀疏数组 对原始的二维数组进行遍历 ...
随机推荐
- elasticsearch如何设计集群
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 在写本文时就在想,如果让你负责一个elasticsearch集群,从零开始,你会从哪些方面 ...
- Traefik-v2.x快速入门
一.概述 traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router.至于使用它的原因则基于以下几点 无须重启即可更新配置 自动的服务发现与负载均衡 与 docke ...
- 浮动引发的高度塌陷问题及其解决方法(BFC相关概念及性质)
浮动引发的高度塌陷问题 高度塌陷问题的产生 BFC(Block Formatting Context)的引入 元素开启BFC后的特点 开启BFC的元素不会被其他浮动元素所覆盖 开启BFC的元素不会发生 ...
- java list集合遍历时删除元素
转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...
- PAT-1066(Root of AVL Tree)Java语言实现
Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...
- docker apollo配置中心分布式部署
Apollo 简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服 ...
- Git 常用命令 和 安装
这年头不会点git还真不能与别人进行代码交流 安装 windowns版下载:https://git-scm.com/download/win ,下载完成后就自己手动安装 ,很简单就不多说. Ubunt ...
- 腾讯云发布存储一体机TStor,打通全面上云“最后一公里”
随着云计算.大数据.人工智能等技术的发展,各行各业加速数据化转型,数据容量以前所未有的速度增长,本地存储难以适应数据的指数式增长. 另一方面,公有云因其易扩展.低成本.安全稳定的特点,逐渐被企业广泛应 ...
- golang 实现距离幂算法
func main() { var test []Pow var x1 Pow x1.distance = 110 x1.grade = 0.31 var x2 Pow x2.distance = 8 ...
- Nuxt.js vue服务端渲染
一.为什么要用Nuxt.js 原因其实不用多说,就是利用Nuxt.js的服务端渲染能力来解决Vue项目的SEO问题. 二.Nuxt.js和纯Vue项目的简单对比 1. build后目标产物不同 vue ...