Java数组07:稀疏数组

一、稀疏数组

  • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
    在这里插入图片描述

  • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。

  • 解决:稀疏数组

    public class ArrayDemo07 {
        public static void main(String[] args) {
            //创建一个二维数组 11*11
            int[][] array1 = new int[11][11];
            //如图棋子位置,给予赋值,数组下标是0开始的
            array1[1][2]=1;
            array1[2][3]=2;
    
            //输出原始的数组
            System.out.println("输出原始的数组");
            for (int[] a :array1) {
                for (int b :  a){
                    System.out.print(b+"\t");
                }
                System.out.println();
            }
    
            System.out.println("===============================================");
            //转化为稀疏数组保存
            //获取有效值的个数
            int sum=0;//定义初始个数
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array1[i].length; j++) {
                    if (array1[i][j] != 0){
                        sum++;
                    }
                }
            }
            System.out.println("有效值的个数:"+sum);
    
            //创建一个稀疏数组的数组
            int[][] array2 = new int[sum+1][3];
            //定义表格头标
            array2[0][0] =11 ;
            array2[0][1] =11 ;
            array2[0][2] =sum;
    
            //遍历二维数组,将非零的值,存放稀疏数组中
            int count = 0 ;// 初始化有效数个数
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array1[i].length; j++) {
                    if (array1[i][j]!=0){
                        count++;
                        array2[count][0] = i;
                        array2[count][1] = j;
                        array2[count][2] =array1[i][j];
                    }
                }
            }
            System.out.println("输出稀疏数组");
    
            for (int[] x : array2) {
                for (int y : x) {
                    System.out.print(y+"\t");
                }
                System.out.println();
            }
    
            System.out.println("================================================");
            System.out.println("还原");
            //读取稀疏数组
            int[][] array3 =new int[array2[0][0]][array2[0][1]];//定义一个二维数组大小
            //给其中的元素还原他的值
            for (int i = 1; i < array2.length; i++) {//去掉表头应该是第一行开始
                    array3 [array2[i][0]] [array2[i][1]] = array2[i][2];
            }
            //打印
            for (int[] a : array3) {
                for (int b : a) {
                    System.out.print(b+"\t");
                }
                System.out.println();
            }
        }
    }
    

二、稀疏数组的介绍

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
  • 稀疏数组的处理方式是:
    • 记录数组一共有几行几列,有多少个不同值。
    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 如下图:左边是原始数组,右边是稀疏数组
    在这里插入图片描述
    package com.chen.myPractice;
    
    public class ArrayDemo02 {
        public static void main(String[] args) {
            //1.输出原始数组======================================================
            System.out.println("输出原始数组======================================");
    
            int[][] array1 = new int[6][7];//定义一个数组
            //如图给数组元素赋值
            array1[0][3]=22;
            array1[0][6]=15;
            array1[1][1]=11;
            array1[1][5]=17;
            array1[2][3]=-6;
            array1[3][5]=39;
            array1[4][0]=91;
            array1[5][2]=28;
    
            //输出打印原始数组
            for (int[] a : array1) {
                for (int b : a) {
                    System.out.print(b+"\t");
                }
                System.out.println();
            }
    
            System.out.println();
            //2.转化为稀疏数组===================================================
            System.out.println("输出稀疏数组=====================================");
    
            //初始化和求得有效数的个数
            int sum =0;//初始化
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array1[i].length; j++) {
                    if (array1[i][j] != 0){
                        sum++;
    //                    System.out.println(i+"\t"+j+"\t"+array1[i][j]);
                    }
                }
            }
            System.out.println("有效数的个数:"+sum+"\n");
    
            int[][] array2 = new int[sum+1][3];//定义一个稀疏数组大小
            //定义表格头标数据
            array2[0][0]= 6;
            array2[0][1]= 7;
            array2[0][2]= sum;
    
            //将有效值的位置和值放入稀疏数组
            int num=0;//有效值的个数
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array1[i].length; j++) {
                    if (array1[i][j]!=0){
                        num++;
                        array2[num][0]=i;
                        array2[num][1]=j;
                        array2[num][2]=array1[i][j];
                    }
                }
            }
            //输入行列值
            System.out.println("\t"+"行"+"\t"+"列"+"\t"+"值");
            //打印出稀疏数组
            for (int i = 0; i < array2.length; i++) {
                System.out.print("["+i+"]"+"\t");
                for (int j = 0; j < array2[i].length; j++) {
    
                    System.out.print(array2[i][j]+"\t");
                }
                System.out.println();
            }
    
            //还原原始数组
            System.out.println();
            System.out.println("还原原始数组=====================================");
            System.out.println();
            //定义一个数组
            int[][] array3= new int[array2[0][0]][array2[0][1]];
            //去掉表头,总共有8个有效值,需循环八次
            for (int i = 1; i < array2.length; i++) {
                array3[array2[i][0]][array2[i][1]]= array2[i][2];
            }
    
            for (int[] a : array3) {
                for (int b : a) {
                    System.out.print(b+"\t");
                }
                System.out.println();
            }
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值