稀疏数组

稀疏数组

稀疏数组是一种数据结构。

需求:编写五子棋游戏中,有存盘退出和续上盘的功能。

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

解决:稀疏数组

稀疏数组介绍

当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。

稀疏数组的处理方式是:

  • 记录数组一共几行几列,有多少个不同值

  • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

如下图:左边是原始数组,右边是稀疏数组

public static void main(String[] args) {
  //1.创建一个二维数组 11*11 0:没有棋子, 1:黑棋   2:白棋
  int[][] array1 = new int[11][11];
  array1[1][2] = 1;
  array1[2][3] = 2;
  //输出原始的数组
  System.out.println("输出原始的数组");

  for (int[] ints : array1) {
      for (int anInt : ints) {
          System.out.print(anInt+"\t");
      }
      System.out.println();
  }
  System.out.println("====================");

  //转换为稀疏数组保存
  //获取有效值的个数
  int sum = 0;
  for (int i = 0; i < 11; i++) {
      for (int j = 0; j < 11; j++) {
          if (array1[i][j] != 0) {
              sum++;
          }
      }
  }
  System.out.println("有效值的个数:"+sum);

  //2.创建一个稀疏数组的数组
  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 i = 0; i < array2.length; i++) {
      System.out.println(array2[i][0]+"\t"
              +array2[i][1]+"\t"
              +array2[i][2]+"\t");
  }

  System.out.println("====================");
  System.out.println("还原");
  //1.读取稀疏数组
  int[][] array3 = new int[array2[0][0]][array2[0][1]];

  //2.给其中的元素还原它的值
  for (int i = 1; i < array2.length; i++) {
      array3[array2[i][0]][array2[i][1]] = array2[i][2];
  }

  //3.打印
  System.out.println("输出还原的数组");

  for (int[] ints : array3) {
      for (int anInt : ints) {
          System.out.print(anInt+"\t");
      }
      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
====================
有效值的个数:2
稀疏数组
11 11 2
1 2 1
2 3 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 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

Process finished with exit code 0

每日Java面试题

一、什么是Java反射机制?

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

二、举例什么地方用到反射机制?

1.JDBC中,利用反射动态加载了数据库驱动程序。

2.Web服务器中利用反射调用了Sevlet的服务方法。

3.Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。

4.很多框架都用到反射机制,注入属性,调用方法,如Spring。

三、Java反射机制的作用

  • 在运行时判定任意一个对象所属的类

  • 在运行时构造任意一个类的对象

  • 在运行时判定任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法

  • 生成动态代理

posted @   崔九八  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示