浅谈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中的RPC框架Dubbo原理和机制详解

    Java中的RPC框架Dubbo原理和机制详解

    这篇文章主要介绍了Java中的RPC框架Dubbo原理和机制详解,Dubbo 是一款Java RPC框架,致力于提供高性能的 RPC 远程服务调用方案,作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利,需要的朋友可以参考下
    2024-01-01
  • Java使用dom4j实现对xml简单的增删改查操作示例

    Java使用dom4j实现对xml简单的增删改查操作示例

    这篇文章主要介绍了Java使用dom4j实现对xml简单的增删改查操作,结合实例形式详细分析了Java使用dom4j实现对xml简单的增删改查基本操作技巧与相关注意事项,需要的朋友可以参考下
    2020-05-05
  • java swing实现贪吃蛇双人游戏

    java swing实现贪吃蛇双人游戏

    这篇文章主要为大家详细介绍了java swing实现贪吃蛇双人小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • PostConstruct注解标记类ApplicationContext未加载空指针

    PostConstruct注解标记类ApplicationContext未加载空指针

    这篇文章主要为大家介绍了@PostConstruct注解标记类ApplicationContext未加载空指针示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 解决@CachePut设置的key值无法与@CacheValue的值匹配问题

    解决@CachePut设置的key值无法与@CacheValue的值匹配问题

    这篇文章主要介绍了解决@CachePut设置的key的值无法与@CacheValue的值匹配问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java批量下载生成zip压缩包的思路详解

    java批量下载生成zip压缩包的思路详解

    这篇文章主要介绍了java批量下载生成zip压缩包的思路详解,设计思路大概是本地先创建一个zip文件,将批量下载的文件依次放入zip文件中,将zip文件返回给前端,本文结合实例代码讲解的非常详细,需要的朋友可以参考下
    2024-01-01
  • 基于SpringBoot解析和生成CSV文件

    基于SpringBoot解析和生成CSV文件

    Apache Commons CSV是Apache Commons项目中的一个子项目,专门用于处理CSV(Comma-Separated Values,逗号分隔值)文件的Java库,CSV是一种常见的数据交换格式,本文给大家介绍了基于SpringBoot解析和生成CSV文件,需要的朋友可以参考下
    2024-12-12
  • Java反射机制详解_动力节点Java学院整理

    Java反射机制详解_动力节点Java学院整理

    Java 反射机制。通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”。这篇文章给大家详细介绍了java反射机制的知识,感兴趣的朋友一起看看吧
    2017-06-06
  • Java对象在JVM中的生命周期详解

    Java对象在JVM中的生命周期详解

    这篇文章主要介绍了Java对象在JVM中的生命周期详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • redis之基于SpringBoot实现Redis stream实时流事件处理方式

    redis之基于SpringBoot实现Redis stream实时流事件处理方式

    这篇文章主要介绍了redis之基于SpringBoot实现Redis stream实时流事件处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论