JavaSE 10(二维数组)

前言:

     在经历了血雨腥风的地狱模式后本以为迎来了学习的平静,但二维数组又打破了这难得的平静!!!二维数组在java编程中同样也是很重要的知识点,因此在这里我将整理二维数组的知识点与重点,以及习题,便于自己的复习与巩固。

二维数组的声明与创建:

下面是声明二维数组的语法

  1. 数据类型[][]数组名
  2. 数据类型数组名[][]; (允许这种方式 但并不推荐使用它)

举例:

如何声明 int 型的二维数组变量 matrix:

  1. int[][] matrix;
  2. int matrix[][];/(允许这种方式 但并不推荐使用它)
  3. int[][] arr = new int[3][2];

(定义了名称为arr的二维数组, 二维数组中有3个一维数组,每一个一维数组中有2个元素)

 

二维数组中使用两个下标,一个表示行另一个表示列同一维数组一样每个下标索

引值都是 int 型的0 开始,如下图所示:

 

 

 

获取二维数组的长度:

 

  1. 二维数组实际上是一个数组它的每个元素都是一个一维数组
  2. 数组 X 的长度是数组中 元素的个数,可以用 x.length 获取该值
  3. 元素 x[0], x[l], x[x.length - l]也是数组
  4. 可以使用 x[0].length, x[l].length, x[x.length - 1] length 获取它们的长度

举例:

假设 x = new int[3][4], 那么 x[0]x[l] X[2]都是一维数组每个数组都 包含 4 个元素,如图8-2所示。

x.length 3, x[0].lengthx[l].length x[2] length 都是 4

 

 

锯齿数组:

 

二维数组中的每一行本身就是一个数组,因此,各行的长度就可以不同

(这样的数组称 为锯齿数组(ragged array)。)

举例

 

上图中可以看到triangleArray[0].length 的值为 5triangleArray[l].length 的值为 4,

triangleArray[2].length 的值为3,triangleArray[3].length 的值为 2, triangleArray[4]. length 的值为1

如果事先不知道锯齿数组的值但知道它的长度正如前面讲到的可以使用如下所示

的语法创建锯齿数组

int[][] triangleArray = new int[5][];

triangleArray[0] = new int[5];

triangleArray[l] = new int[4];

triangleArray[2] =new int[3];

triangleArray[3] = new int[2];

triangleArray[4] = new int[l];

现在可以给数组賦值例如

triangleArray[0][3] =50;

triangleArray[4][0] = 45;

 

 

二维数组内存图解

 

 

 

使用二维数组解决的经典习题:

 

 

1.

 

1.思路及步骤:

 

 

2.编程代码及运行结果:

 

import java.util.Scanner;                        //调用java工具包
class Class35{
    public static void main(String[] args){      //定义主函数
        Scanner scanner=new Scanner(System.in);  //提示用户输入行 列
        System.out.print("请输入行列:");
        int row=scanner.nextInt();                //行
        int col=scanner.nextInt();                //列
        double[][] matrix=new double[row][col];   //定义一个double类型的二维数组
        for(int i=0;i<matrix.length;i++){         //遍历这个二维数组使其变成矩阵
            for(int j=0;j<matrix[i].length;j++){  
                matrix[i][j]=scanner.nextDouble();//i为矩阵的行,j为矩阵中第i行的第j个元素
            }
        }
        for(int j=0;j<col;j++){                    //外侧大循环控制列
            double sum=0;                          //定义一个double类型的变量sum并给其赋值为0
            for(int i=0;i<row;i++){                //内侧小循环控制行
                sum+=matrix[i][j];                 //求制定列的和
            }
            System.out.println(j+" col's sum is "+sum);//输出结果
        }
    }
      
}

 

 

2.

五子棋

1.思路及步骤:

 

 

2.编程代码及运行结果:

import java.util.Scanner;
class WuZiQi{
    //定义一个全局的棋盘
    public static String[][] board;
    //定义棋盘的尺寸size*size final类型 不可修改变量的值
    public static final int SIZE=15;
    public static final String NULL_CHESS="+ "; //空棋子
    public static final String BLACK_CHESS="X ";//黑棋子
    public static final String WHITE_CHESS="O ";//白棋子
    public static Scanner scanner=new Scanner(System.in);

    public static void main(String[] args){
        //制作棋盘
        initBoard();
        //打印棋盘
        showBoard();
        //开始游戏
        startGame();
    }
    public static void startGame(){
        int player=0;
        int result=0;
        while((result=isGameOver())==0){
            if(player%2==0){    //黑方
                System.out.println(">>>请黑方下棋:");
                if(!putChess(BLACK_CHESS)){
                    System.out.println(">>>此处已有棋子,请重新下棋!");
                    continue;
                }
            }else{              //白方
                System.out.println(">>>请白方下棋:");
                if(!putChess(WHITE_CHESS)){
                    System.out.println(">>>此处已有棋子,请重新下棋!");
                    continue;
                }
            }
            player++;
        }
        if(result==1){
            if(player%2==1){
                System.out.println(">>>游戏结束!黑方胜!");
            }else{
                System.out.println(">>>游戏结束!白方胜!");
            }
        }else{
            System.out.println(">>>游戏结束!和棋!");
        }
        
        
    }
    public static int isGameOver(){
        int count=0;
        //累计棋子的个数 然后再判断是否五子连珠
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                if(!board[i][j].equals(NULL_CHESS)){
                    count++;
                    //当前的坐标 i j
                    //向右 (i,j) (i,j+1) (i,j+2) (i,j+3) (i,j+4)
                    if(j<11){
                        if(board[i][j].equals(board[i][j+1])
                            &&board[i][j].equals(board[i][j+2])
                            &&board[i][j].equals(board[i][j+3])
                            &&board[i][j].equals(board[i][j+4])){
                                return 1;
                        }
                    }
                    //向下
                    if(i<11){
                        if(board[i][j].equals(board[i+1][j])
                            &&board[i][j].equals(board[i+2][j])
                            &&board[i][j].equals(board[i+3][j])
                            &&board[i][j].equals(board[i+4][j])){
                                return 1;
                        }
                    }
                    //向右下
                    if(i<11&&j<11){
                        if(board[i][j].equals(board[i+1][j+1])
                            &&board[i][j].equals(board[i+2][j+2])
                            &&board[i][j].equals(board[i+3][j+3])
                            &&board[i][j].equals(board[i+4][j+4])){
                                return 1;
                        }
                    }
                    //向右上
                    if(i>3&&j<11){
                        if(board[i][j].equals(board[i-1][j+1])
                            &&board[i][j].equals(board[i-2][j+2])
                            &&board[i][j].equals(board[i-3][j+3])
                            &&board[i][j].equals(board[i-4][j+4])){
                                return 1;
                        }
                    }
                }
            }
        }
        //判断和棋 棋子数==SIZE*SIZE
        if(count==SIZE*SIZE){
            return 2;    
        }
        return 0;
    }
    public static boolean putChess(String chess){
        System.out.print(">>>x=");
        int x=scanner.nextInt()-1;  //x 行
        System.out.print(">>>y=");
        int y=scanner.nextInt()-1;  //y 列
        if(board[x][y].equals(NULL_CHESS)){
            board[x][y]=chess;
            showBoard();
            return true;    //已下
        }else{
            showBoard();
            return false;   //未下
        }
    }
    public static void showBoard(){
        System.out.print("  ");
        for(int i=1;i<=SIZE;i++){
            System.out.printf("%-2d",i);
        }
        System.out.println();
        int index=1;
        for(int i=0;i<board.length;i++){
            System.out.printf("%-3d",index++);
            for(int j=0;j<board[i].length;j++){
                System.out.print(board[i][j]);
            }
            System.out.println();
        }
    }
    public static void initBoard(){
        board=new String[SIZE][SIZE];   //字符串是引用数据类型 默认初始值null
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                board[i][j]=NULL_CHESS;
            }
        }
    }
}

 

 

总结:

熟练运用二维数组,并且将二维数组看做矩阵,并且将二维数组 a[i][j],与矩阵的行列相对应来求解问题。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为weixin_45333967原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45333967/article/details/97664171

智能推荐

Python学习练习6----列表、字典的运用2

range 用法参见http://blog.csdn.net/chiclewu/article/details/50592368 直接在 在线编程工具中练习: https://www.tutorialspoint.com/execute_python_online.php 代码如下,增加range、列表的len()、字典的items()函数,for 函数也有了新变化 练习2: 2的运行结果,注意p...

PoolThreadCache

缓存构成   PoolThreadCache的缓存由三部分构成:tiny、small 和 normal。 tiny   缓存数据大小区间为[16B, 496B]数据,数组长度为32,根据数据大小计算索引的办法:数据大小除以16,如下代码所示: small   缓存数据大小区间为[512B, 4KB]数据,数组长度为4,根据数据大小计算索引的办法:数据大小除以512,然后log2得到指数,如下代码所...

Intellij IDEA 搭建Spring Boot项目(一)

Intellij IDEA 搭建Spring Boot项目 标签(空格分隔): SpringBoot JAVA后台 第一步 选择File –> New –> Project –>Spring Initialer –> 点击Next  第二步 自己修改 Group 和 Artif...

CentOS学习之路1-wget下载安装配置

参考1: https://blog.csdn.net/zhaoyanjun6/article/details/79108129 参考2: http://www.souvc.com/?p=1569 CentOS学习之路1-wget下载安装配置 1.wget的安装与基本使用 安装wget yum 安装软件 默认安装保存在/var/cache/yum ,用于所有用户使用。 帮助命令 基本用法 例子:下载...

深入浅出Spring的IOC容器,对Spring的IOC容器源码进行深入理解

文章目录 DispatcherServlet整体继承图 入口:DispatcherServlet.init() HttpServletBean.init() FrameworkServlet.initServletBean() 首先大家,去看Spring的源码入口,第一个就是DispatcherServlet DispatcherServlet整体继承图 入口:DispatcherServlet....

猜你喜欢

laravel框架的课堂知识点概总

1. MVC 1.1 概念理解 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑 MVC 是一种使用 MVC(Model View Controller ...

Unity人物角色动画系统学习总结

使用动画系统控制人物行走、转向、翻墙、滑行、拾取木头 混合树用来混合多个动画 MatchTarget用来匹配翻墙贴合墙上的某一点,人物以此为支点翻墙跳跃 IK动画类似于MatchTarget,控制两只手上的两个点来指定手的旋转和位置,使得拾取木头时更逼真 创建AnimatorController: 首先创建一个混合树,然后双击 可以看到该混合树有五种状态机,分别是Idle、WalkForward、...

Composer 安装 ThinkPHP6 问题

Composer 安装 ThinkPHP6 问题 先说说问题 一.运行环境要求 二.配置 参考: ThinkPHP6.0完全开发手册 先说说问题 执行ThinkPHP6的安装命令 遇到问题汇总如下: 看提示是要更新版本,执行命令更新。 更新之后,再次安装ThinkPHP,之后遇到如下问题。 尝试了很多方法,依然不能解决。其中包括使用https://packagist.phpcomposer.com...

Spring Boot 整合JDBC

今天主要讲解一下SpringBoot如何整合JDBC,没啥理论好说的,直接上代码,看项目整体结构 看一下对应的pom.xml 定义User.java 定义数据源配置,这里使用druid,所以需要写一个配置类 上面指定druid的属性配置,和用户登录的账号信息以及对应的过滤规则: 下面定义数据访问接口和对应的实现: 数据访问层很简单,直接注入JdbcTemplate模板即可,下面再看对应的servi...

html鼠标悬停显示样式

1.显示小手:     在style中添加cursor:pointer 实现鼠标悬停变成小手样式     实例:         其他参数: cursor语法: cursor : auto | crosshair | default | hand | move | help | wait | tex...