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

   

原数组内容:
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. 关于Java高并发编程你需要知道的“升段攻略”

    关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...

  2. 后端程序员之路 40、Pthreads

    POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准.线程这个东西在操作系统原理里讲得比较清楚了,再加上对windows那一套进程线程的东西比较清楚,所以这里还是 ...

  3. 后端程序员之路 8、一种内存kv数据库的实现

    键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织.索引和存储.KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘 ...

  4. c++类的简介

    一 类的定义 在c++中,我们使用"类"来描述"对象",可以说"类"的实现是c++OOP的核心. 类中包括对象的"属性" ...

  5. 《C++ Primer》笔记 第10章 泛型算法

    迭代器令算法不依赖于容器,但算法依赖于元素类型的操作. 算法永远不会执行容器的操作.算法永远不会改变底层容器的大小. accumulate定义在头文件numeric中,接受三个参数,前两个指出需要求和 ...

  6. HDOJ-1686(KMP算法)

    Oulipo HDOJ-1686 本题的思路就是KMP,和HDOJ-1711思路一样,不再赘述详情可以看链接:1711题解 #include<iostream> #include<c ...

  7. ASP.NET如何把ASPX网站部署到IIS上

    当一个项目完成了,你是否想过把它发布到服务器上去呢?那么下面就来告诉你如何去部署它吧! (Visual Studio版本: 2019) 首先要准备好你的项目 然后进行如下操作 第一大步骤 1.打开你需 ...

  8. pytorch(09)transform模块(基础)

    transforms transforms运行机制 torchvision.transforms:常用的图像预处理方法 torchvision.datasets:常用数据及的dataset实现,mni ...

  9. salesforce零基础学习(一百零一)如何了解你的代码得运行上下文

    本篇参考:https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_enum_System ...

  10. MySQL 表的约束与数据库设计

    DQL 查询语句 排序 # 单列排序 * 只按某一个字段进行排序,单列排序 # 组合排序 * 同时对多个字段进行排序,如果第1个字段相等,则按照第2个字段排序,依次类推 * 语法: # 具体操作 * ...