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

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

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

xdmx   2021-05-25 我要评论
想了解浅谈Java数据结构之稀疏数组知识总结的相关内容吗,xdmx在本文为您仔细讲解Java稀疏数组的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点: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();
        }
    }
}

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们