zoukankan      html  css  js  c++  java
  • 一、数组与稀疏数组

    1、数组:数组是最常用的数据结构,是一种顺序的线性结构。“数“指数据,如数值,字符等;”组“指组合,顾名思义数组就是一组相似的数据的一个组合。

    1.1、数组的实现

    package array;
    
    public class Array {
        public static void main(String[] args) {
            //1.创建数组时,直接赋值,一次创建,后期不可更改大小
            int[] arr1 = {1,4,6,9,12};
            //2.创建数组时,先给定大小,后期再往里面加数据
            int[] arr2 = new int[5];
            arr2[0] = 14;
            arr2[1] = 3;
            arr2[2] = 6;
            arr2[3] = 23;
            arr2[4] = 2;
            //3.字符串型数组,直接赋值
            String[] str1 = {"obama","trump","bush","张三"};
            //4.字符串型数组,先给定大小,再根据数组下标赋值
            String[] str2 = new String[3];
            str2[0]= "Jack";
            str2[1] = "Ross";
            str2[2] = "Titanic";
            //5.遍历数组
            for(int i=0;i<arr1.length;i++) {
                System.out.printf("arr1[%d]=%d	",i,arr1[i]); 
            }
            System.out.println();
            for(int i=0;i<str1.length;i++) {
                System.out.printf("str1[%d]=%s	",i,str1[i]);
            }
            System.out.println();
            //5.根据数组下标取单个数组中的数据
            System.out.println("arr2[1]="+arr2[1]);
            System.out.println("str2[1]="+str2[0]);
        }
    }
    输出结果:
    
    arr1[0]=1    arr1[1]=4    arr1[2]=6    arr1[3]=9    arr1[4]=12    
    str1[0]=obama    str1[1]=trump    str1[2]=bush    str1[3]=张三    
    arr2[1]=3
    str2[1]=Jack

     1.2、二维数组:一维数组的索引下标是一个数,一个下标索引对应一个值,二维数组是在一维数组上扩展开来,即用两个数来确认一个索引下标。

      比如如下图的棋盘可用二维数组表示:

     

    public class TwoArray {
        public static void main(String[] args) {
            //创建二维数组
            int[][] arr = new int[11][11];
            //数组默认值为0;1表示黑子,2表示蓝子
            arr[1][2] = 1;
            arr[2][3] = 2;
            //打印二维数组;
            for(int i=0;i<arr.length;i++){
                for(int j=0;j<arr.length;j++){
                    System.out.print(arr[i][j]+" ");
                }
                System.out.println();
            }
        }
    }
    
    打印输出二维数组:
    
    0 0 0 0 0 0 0 0 0 0 0 
    0 0 1 0 0 0 0 0 0 0 0 
    0 0 0 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 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 
    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 0 0 

       1.3、二维数组转成稀疏数组

     

       1.3.1、应用实例,使用稀疏数组,来保存类似于前面的棋盘或地图:

     代码实现:

    package com.array;
    
    public class SparseArray {
        public static void main(String[] args) {
            //创建原始的二维数组表示棋盘
            int chessArr1[][] = new int[11][11];
            //0表示没有子,1表示黑子,2表示蓝子
            chessArr1[1][2] = 1;
            chessArr1[2][3] = 2;
            chessArr1[4][5] = 2;
            //输出原始二维数组:
            System.out.println("原始的二维数组:");
            for (int[] row : chessArr1) {
                for (int data : row) {
                    System.out.printf("%d	", data);
                }
                System.out.println();
            }
    
            //将二维数组,转成 稀疏数组
            //1.先遍历二维数组,得到非0数据的个数
            int sum = 0;
            for (int i = 0; i < chessArr1.length; i++) {
                for (int j = 0; j < chessArr1.length; j++) {
                    if (chessArr1[i][j] != 0) {
                        sum++;
                    }
                }
            }
    
            //创建对应的稀疏数组
            int sparseArr[][] = new int[sum + 1][3];
            sparseArr[0][0] = chessArr1.length;
            sparseArr[0][1] = chessArr1.length;
            sparseArr[0][2] = sum;
    
            //遍历二维数组,将非0的值存到sparseArr中
            int count = 0;//count记录是第几个非0数据
            for (int i = 0; i < chessArr1.length; i++) {
                for (int j = 0; j < chessArr1.length; j++) {
                    if (chessArr1[i][j] != 0) {
                        count++;
                        sparseArr[count][0] = i;
                        sparseArr[count][1] = j;
                        sparseArr[count][2] = chessArr1[i][j];
                    }
                }
            }
    
            //输出稀疏数组的形式
            System.out.println();
            System.out.println("得到的稀疏数组~~~~~~");
            for (int i = 0; i < sparseArr.length; i++) {
                System.out.printf("%d	%d	%d	
    ", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
            }
            System.out.println();
    
            //将稀疏数组 -->回复成原始的二维shuz
            //1.先读取稀疏数组的第一行,并赋值给原始的二维数组
            int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
            //2.读取稀疏数组后几行的数据(从第二行开始),并赋值给原始的二维数组
            for (int i = 1; i < sparseArr.length; i++) {
                chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
            }
    
            //输出恢复后的二维数组
            System.out.println();
            System.out.println("恢复后的二维数组");
    
            for (int[] row : chessArr2) {
                for (int data : row) {
                    System.out.printf("%d	", data);
                }
                System.out.println();
            }
        }
    }
    
    
    
    结果打印输出:
    
    原始的二维数组:
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    1    0    0    0    0    0    0    0    0    
    0    0    0    2    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    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    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    0    0    0    0    0    0    0    0    0    
    
    得到的稀疏数组~~~~~~
    11    11    3    
    1    2    1    
    2    3    2    
    4    5    2    
    
    
    恢复后的二维数组
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    1    0    0    0    0    0    0    0    0    
    0    0    0    2    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    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    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    0    0    0    0    0    0    0    0    0    

    总结:稀疏数组可以认为是对原始二维数组的压缩,可节约内存空间!

     

  • 相关阅读:
    牛客网 剑指Offer JZ19 顺时针打印矩阵
    牛客网 剑指Offer Z18 二叉树的镜像
    牛客网 剑指Offer JZ17 树的子结构
    一键安装脚本(MySQL双主、EMQX集群、FastDFS集群)
    API和拦截器相关的设计简记
    C# 获取今天,昨天,上周,下周,上月,下月等等一些日期格式
    Element.scrollIntoView()
    自主学习(1)--matlab
    四则运算java
    学习计划
  • 原文地址:https://www.cnblogs.com/zsy-code/p/13470927.html
Copyright © 2011-2022 走看看