浅谈Java数据结构之稀疏数组知识总结

 更新时间:2021年05月25日 08:53:27   作者:xdmx  
今天带大家了解一下Java稀疏数组的相关知识,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下

稀疏数组

  • 当一个数组中的元素大多为0或者相同元素的时候,可以用稀疏数组来压缩
  • 稀疏数组只记录 行row 列col 值value

将下列的二维数组转为稀疏数组,如下两图所示

二维数组
稀疏数组

1.实现二维数组转为稀疏数组的步骤:

  • 遍历数组,得到数组中 不为0的个数,并记录为sum,作为稀疏数组第0行的 value
  • 遍历数组,将数组中不为0的数的行和列和值分别写入稀疏数组的 row col val 中

代码实现:

public class SparseArray {
    public static void main(String[] args) {

        // 创建一个原始二维数组
        // 0表示没有棋子,1,2各表示一种棋
        int chessArr[][] = new int[8][8];
        chessArr[1][1] = 1;
        chessArr[2][2] = 2;

        // 遍历原始数组,获得不等于 0 的个数,并输出原始数组
        int sum = 0;
        System.out.println("原始数组:");
        for (int[] ints : chessArr) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
                if (anInt != 0){
                    sum++;
                }
            }
            System.out.println();
        }
        System.out.println(sum);

        // 创建稀疏数组并赋值
        int sparseArray[][] = new int[sum+1][3];
        int row = chessArr.length; // 原数组的行数
        int col = chessArr[0].length; // 原数组的列数
        sparseArray[0][0] = row;
        sparseArray[0][1] = col;
        sparseArray[0][2] = sum;

        // 遍历原始数组并赋值给稀疏数组
        int count = 0; // count 为计数器
        for (int i = 0;i < row;i++) {
            for (int j = 0;j < col;j++) {
                if (chessArr[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArr[i][j];
                }
            }
        }

        // 输出得到的稀疏数组
        System.out.println("稀疏数组为:");
        for (int i = 0 ;i < sparseArray.length;i++) {
            System.out.println(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);
        }

    }
}

2.实现二维数组转稀疏数组的步骤

  • 根据稀疏数组的第一行创建新的二维数组
  • 遍历稀疏数组,将row col val 赋给新的二维数组

代码实现:

public class SparseArray {
    public static void main(String[] args) {
        
        
		...... // 接上一段代码
            
            
        // 输出得到的稀疏数组
        System.out.println("稀疏数组为:");
        for (int i = 0 ;i < sparseArray.length;i++) {
            System.out.println(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);
        }

        // 创建新的二维数组
        int newChessArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i = 1 ;i < sparseArray.length;i++) {
            newChessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        // 输出新的二维数组
        System.out.println("恢复后的二维数组是:");
        for (int[] ints : newChessArray) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}

3.将稀疏数组写入磁盘

public static void main(String[] args) {
    ........
	// 将稀疏数组存入磁盘
    FileOutputStream fw = null;
    try {
        fw = new FileOutputStream("sparseArray.txt");
        // 遍历写入磁盘
        for (int i = 0; i < sparseArray.length; i++) {
            for (int j = 0; j < 3; j++) {
                fw.write(sparseArray[i][j]);
            }
        }
        fw.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fw != null){
            fw.close();
        }
    }
}

4.从磁盘读取稀疏数组

public static void main(String[] args) {
    .......
    // 从磁盘读取稀疏数组
    FileInputStream fi = null;
    int newSparseArray[][] = new int[sum+1][3];  // sum 指前面二维数组有值的个数
    try {
        fi = new FileInputStream("sparseArray.txt");
        for (int i = 0;i < newSparseArray.length;i++) {
            for (int j = 0;j < 3;j++){
                newSparseArray[i][j] = fi.read();
            }
        }
    } catch (FileNotFoundException e){
        e.printStackTrace();
    } finally {
        if (fi != null){
            fi.close();
        }
    }
}

到此这篇关于浅谈Java数据结构之稀疏数组知识总结的文章就介绍到这了,更多相关Java稀疏数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java ThreadGroup的作用及方法详解

    java ThreadGroup的作用及方法详解

    这篇文章主要介绍了java ThreadGroup的作用及方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java实现文件上传、下载、图片预览

    java实现文件上传、下载、图片预览

    这篇文章主要介绍了java实现文件上传、下载、图片预览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • java实现动态时钟并设置闹钟功能

    java实现动态时钟并设置闹钟功能

    这篇文章主要为大家详细介绍了java实现动态时钟并设置闹钟功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java中Socket用法详解

    Java中Socket用法详解

    本文详细讲解了Java中Socket的用法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • redis做服务间通信工具的项目示例

    redis做服务间通信工具的项目示例

    Redis是一种高效的服务间通信工具,它以键值对的形式存储数据,并支持多种数据类型和丰富的操作,本文主要介绍了redis做服务间通信工具的项目示例,感兴趣的可以了解一下
    2023-08-08
  • java 中ThreadLocal本地线程和同步机制的比较

    java 中ThreadLocal本地线程和同步机制的比较

    这篇文章主要介绍了java 中ThreadLocal本地线程和同步机制的比较的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java实现快速排序和堆排序的示例代码

    Java实现快速排序和堆排序的示例代码

    这篇文章主要为大家详细介绍了快速排序和堆排序的多种语言的实现(JavaScript、Python、Go语言、Java、C++),感兴趣的小伙伴可以了解一下
    2022-12-12
  • 使用jdk7的nio2操作文件拷贝和剪切示例

    使用jdk7的nio2操作文件拷贝和剪切示例

    使用jdk7的NIO2进行文件或文件夹的拷贝移动操作。可以自动创建路径,差异化更新文件,简单的出错重连机制
    2014-01-01
  • Java常用集合与原理解析

    Java常用集合与原理解析

    这篇文章主要介绍了Java常用集合与原理解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 如何使用JJWT及JWT讲解和工具类

    如何使用JJWT及JWT讲解和工具类

    关于JWT的文章网上已经多如牛毛了,但是相信很多同学学的还是云里雾里,所以在我学习JWT之后尽量用最简洁的描述写下这篇文章用于日后复习,与此同时也希望可以帮助同学们共同进步
    2021-09-09

最新评论