主要是用于数组压缩,去除无效的数组内容:

   

原数组内容:
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数组即对象:

对象即类创建出来的实例。对象具有各种属性,并且具有一些特定的行为,对象是内存中的内存块,在这个内存块中封装了一些数据,也就是类中定义的各个属性,所以对象就是用来封装数据。
数组就是封装数据,如果定义int类型他就是存储int类型数据
 
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());
}
}

数组即对象,他的父类型是object类型。
序列化和反序列化就是序列化对象,然后在反序列化对象,原封不动还原对象内容:
序列化然后反序列化:
 
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实现的更多相关文章

  1. 图解Java数据结构之稀疏数组

    在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...

  2. Java数据结构之稀疏数组(Sparse Array)

    1.需求 编写的五子棋程序中,有存盘退出和续上盘的功能.因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,为了压缩存储所以采用稀疏数组. 2.基本介绍 当一个数组中大部分元素为0,或者为 ...

  3. golang数据结构之稀疏数组

    掌握知识: 数组的初始化和赋值 结构体的初始化和赋值 字符串和整型之间的转换以及其它的一些操作 类型断言 读取文件 写入文件 对稀疏数组进行压缩 package main import ( " ...

  4. 稀疏数组(java实现)

    1.稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.1记录数组一共有几行几列,有多少个不同的值 1.2把具有不同值的元素的行列 ...

  5. 02稀疏数组(java版本)

    1 package com.aixuexi.contact; 2 3 public class SpareArray { 4 public static void main(String[] args ...

  6. Java的稀疏数组的简单代码实现

    目录 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 二.稀疏数组的Java代码实现思路 三.稀释数组的Java代码实现 四.结语 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 ...

  7. 数据结构与算法之java语言实现(一):稀疏数组

    一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...

  8. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

  9. Java成神之路:第二帖---- 数据结构与算法之稀疏数组

    数据结构与算法--稀疏数组 转换方法 记录数组有几行几列,有多少个不同的值 把不同的值的元素的行列,记录在一个小规模的数组中,以此来缩小数组的规模 如图: 二维数组转稀疏数组 对原始的二维数组进行遍历 ...

随机推荐

  1. elasticsearch如何设计集群

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 在写本文时就在想,如果让你负责一个elasticsearch集群,从零开始,你会从哪些方面 ...

  2. Traefik-v2.x快速入门

    一.概述 traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router.至于使用它的原因则基于以下几点 无须重启即可更新配置 自动的服务发现与负载均衡 与 docke ...

  3. 浮动引发的高度塌陷问题及其解决方法(BFC相关概念及性质)

    浮动引发的高度塌陷问题 高度塌陷问题的产生 BFC(Block Formatting Context)的引入 元素开启BFC后的特点 开启BFC的元素不会被其他浮动元素所覆盖 开启BFC的元素不会发生 ...

  4. java list集合遍历时删除元素

    转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...

  5. PAT-1066(Root of AVL Tree)Java语言实现

    Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...

  6. docker apollo配置中心分布式部署

    Apollo 简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服 ...

  7. Git 常用命令 和 安装

    这年头不会点git还真不能与别人进行代码交流 安装 windowns版下载:https://git-scm.com/download/win ,下载完成后就自己手动安装 ,很简单就不多说. Ubunt ...

  8. 腾讯云发布存储一体机TStor,打通全面上云“最后一公里”

    随着云计算.大数据.人工智能等技术的发展,各行各业加速数据化转型,数据容量以前所未有的速度增长,本地存储难以适应数据的指数式增长. 另一方面,公有云因其易扩展.低成本.安全稳定的特点,逐渐被企业广泛应 ...

  9. golang 实现距离幂算法

    func main() { var test []Pow var x1 Pow x1.distance = 110 x1.grade = 0.31 var x2 Pow x2.distance = 8 ...

  10. Nuxt.js vue服务端渲染

    一.为什么要用Nuxt.js 原因其实不用多说,就是利用Nuxt.js的服务端渲染能力来解决Vue项目的SEO问题. 二.Nuxt.js和纯Vue项目的简单对比 1. build后目标产物不同 vue ...