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

   

原数组内容:
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. 高级FTP

      一.作业需求 1. 用户加密认证(已完成) 2. 多用户同时登陆(已完成) 3. 每个用户有自己的家目录且只能访问自己的家目录(已完成) 4. 对用户进行磁盘配额.不同用户配额可不同(已完成) 5 ...

  2. 关于安装VMware以及Linux操作系统过程

    想用Linux完成部分教学作业,虚拟机是少不了的,所以首先选择了VMware进行安装. VMware在官网下载之后,就可以直接打开安装,但是在安装过程中,建议不要勾选启动时检查产品更新和加入VMwar ...

  3. 数组的常用方法之split

    今天我们来聊一下数组的常用方法:split 返回值:一个新数组. 1.该方法可以直接调用不传任何值,则会直接将字符串转化成数组. var str = 'I love Javascript'; cons ...

  4. 11. webpack配置Vue

    一. 在webpack中配置vue 了解了webpack的原理和用法以后, 我们来引入Vue webpack原理和用法详解链接: cnblogs.com/ITPower/p/14467745.html ...

  5. Vue.js 实现的 3D Tab菜单

    今天给大家带来一款基于VueJS的3D Tab菜单,它跟我们之前分享的许多CSS3 Tab菜单不同的是,它可以随着鼠标移动呈现出3D立体的视觉效果,每个tab页面还可以通过CSS自定义封面照片.它的核 ...

  6. WeihanLi.Npoi 1.16.0 Release Notes

    WeihanLi.Npoi 1.16.0 Release Notes Intro 最近有网友咨询如何设置单元格样式,在之前的版本中是不支持的,之前主要考虑的是数据,对于导出的样式并没有支持,这个 is ...

  7. SQL-MYSQL的时间格式转换(持续补充)

    ======================SQLSERVER===================================== SELECT CONVERT(varchar(100), GE ...

  8. ASP.NET Core扩展库之日志

        上一篇我们对Xfrogcn.AspNetCore.Extensions扩展库功能进行了简单的介绍,从这一篇文章开始,我将逐步介绍扩展库中的核心功能.     日志作为非业务的通用领域基础功能, ...

  9. 两种常见Content-type的方便理解

    application/x-www-form-urlencoded:key=value键值对application/json:{name:"张三"} JSON字符串塞到请求的bod ...

  10. BZOJ_2115 [Wc2011] Xor 【图上线性基】

    一.题目 [Wc2011] Xor 二.分析 比较有意思的一题,这里也学到一个结论:$1$到$N$的任意一条路径异或和,可以是一个任意一条$1$到$N$的异或和与图中一些环的异或和组合得到.因为一个数 ...