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

   

原数组内容:
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. BSOJ 1562 【堆练习】丑数3576

    Description 丑数是指素因子都在集合{2,3,5,7}内的整数,第一个丑数是1. 现在输入n(n<=4000),输出第n个丑数. Input 输入文件仅一行为一个整数n. Output ...

  2. 死磕Spring之IoC篇 - Bean 的创建过程

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  3. go mod包管理 加代理下载

    原始go.mod文件 module xxx go 1.14 报错 i/o timeout go mod init workorder go mod init: go.mod already exist ...

  4. Shiro反序列化漏洞检测、dnslog

    目录 信息收集 poc 参考 信息收集 poc # pip install pycrypto import sys import base64 import uuid from random impo ...

  5. 12张图打开JMeter体系结构全局视角

    JMeter是Java技术栈工具,在软件测试领域应用非常广泛,无论是性能测试还是接口测试,技术都很成熟和稳定.它有一个突出特点:开源,适合做二次开发,以阿里为代表的Java技术栈公司都对它青睐有加.在 ...

  6. 使用CSS计数器美化数字有序列表

    在web设计中,使用一种井井有条的方法来展示数据是十分重要的,这样用户就可以很清晰的理解网站所展示的数据结构和内容,使用有序列表就是实现数据有组织的展示的一种简单方法. 如果你需要更加深入地控制有序列 ...

  7. C语言经典88案例,我文科妹妹说她都学会了!

    案例ex01: 将字符串转换为一个整数 1 题目 函数:fun() 功能:将字符串转换为一个整数 描述: [不能使用C语言提供的字符串函数] 输入:字符串"-1234" 输出:整型 ...

  8. WPF 基础 - 点击事件的执行顺序及 Button 点击事件的特殊性

    1. 点击事件的执行顺序 PreviewMouseLeftButtonDown PreviewMouseDown MouseLeftButtonDown MouseDown PreviewMouseL ...

  9. WPF 基础 - 图形的效果与滤镜

    UIElement 有 BitmapEffect 和 Effect 属性,BitmapEffect 是由 CPU 的运算能力实现的,比较耗性能,推荐使用 Effect: Effect 包括但不限于 D ...

  10. 史上超强拷贝仓——GitHub 热点速览 v.21.11

    作者:HelloGitHub-小鱼干 Clone-Wars 是真的强,能细数 70+ 知名应用网站的源码,即便你不看代码,也可以了解下各大网站的所用技术栈.同样很强的是用 OpenCV 实现的图片转 ...