Java数组(二)

news2024/11/17 3:41:06

Java数组(二)

1、多维数组

  • 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
  • 二维数组
int a[][] = new int[2][5];

解析:以上二维数组a可以看成一个两行五列的数组。

画图理解

在这里插入图片描述

可以理解为一维数组是一个线,每个元素是线上的一个点,二维数组是一个面,此时,每个元素依旧是面上的一个点,相对于线,你就需要有两个坐标去确定它

思考:多维数组的使用?

package com.xxsml.array;

public class ArrayDemo05 {
    public static void main(String[] args) {
        //[4][2]
        /*
            1,2  array[0]
            2,3  array[1]
            3,4  array[2]
            4,5  array[3]
         */
        int[][] array = {{1,2},{2,3},{3,4},{4,5}};

        System.out.println("=====输出外层数组长度=====");
        System.out.println(array.length);
        System.out.println("=====输出array[0]数组长度=====");
        System.out.println(array[0].length);
        System.out.println("=====直接输出array[0]=====");
        System.out.println(array[0]);  //[I@1540e19d  输出地址的原因因为array[0]代表的是{1,2}
        System.out.println("=====输出array[0][0]的值=====");
        System.out.println(array[0][0]);
        System.out.println("=====输出array[0][1]的值=====");
        System.out.println(array[0][1]);
        System.out.println("=====循环输出外层内层数组的长度=====");
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.println(array[i][j]);
            }
        }
    }
}

输出结果

=====输出外层数组长度=====
4
=====输出array[0]数组长度=====
2
=====直接输出array[0]=====
[I@1540e19d
=====输出array[0][0]的值=====
1
=====输出array[0][1]的值=====
2
=====循环输出外层内层数组的长度=====
1
2
2
3
3
4
4
5

2、Arrays类

  • 数组的工具类java.util.Arrays
  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
  • 查看JDK帮助文档
  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用”而不是“不能")
  • 具有以下常用功能:
    • 给数组赋值:通过fill方法。
    • 对数组排序:通过sot方法,按升序。
    • 比较数组:通过equals方法比较数组中元素值是否相等。
    • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

例1:

package com.xxsml.array;

import java.util.Arrays;

public class ArrayDemo06 {
    public static void main(String[] args) {
        int[] a = {1,2,54,34,6,4,3,43,3,5,867};

        //打印数组元素Arrays.toString
        System.out.println(Arrays.toString(a));

        //数组进行排序:升序
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));

        //2~4用填充
        Arrays.fill(a,2,4,0);
        System.out.println(Arrays.toString(a));

        //数组填充
        Arrays.fill(a,0);
        System.out.println(Arrays.toString(a));
    }
}

输出结果

[1, 2, 54, 34, 6, 4, 3, 43, 3, 5, 867]
[1, 2, 3, 3, 4, 5, 6, 34, 43, 54, 867]
[1, 2, 0, 0, 4, 5, 6, 34, 43, 54, 867]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

toString是说以字符串的形式表示出来

总结和拓展

  1. 转换为字符串(Converting to String)Arrays.toString() 方法用于将数组转换为字符串,便于打印输出。

    java复制代码int[] arr = {1, 2, 3};
    System.out.println(Arrays.toString(arr));  // 输出:[1, 2, 3]
    
  2. 排序(Sorting)Arrays.sort() 方法用于对数组进行排序。默认情况下,它会按升序排序数组元素。

    java复制代码int[] arr = {3, 1, 4, 2};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));  // 输出:[1, 2, 3, 4]
    
  3. 填充(Filling)Arrays.fill() 方法用指定的值填充数组的所有元素。

    java复制代码int[] arr = new int[5];
    Arrays.fill(arr, 10);
    System.out.println(Arrays.toString(arr));  // 输出:[10, 10, 10, 10, 10]
    
  4. 复制(Copying)Arrays.copyOf() 方法用于复制数组。可以指定要复制的长度。

    java复制代码int[] source = {1, 2, 3, 4, 5};
    int[] target = Arrays.copyOf(source, 3);
    System.out.println(Arrays.toString(target));  // 输出:[1, 2, 3]
    
  5. 比较(Comparing)Arrays.equals() 方法用于比较两个数组是否相等。

    java复制代码int[] arr1 = {1, 2, 3};
    int[] arr2 = {1, 2, 3};
    System.out.println(Arrays.equals(arr1, arr2));  // 输出:true
    
  6. 搜索(Searching)Arrays.binarySearch() 方法用于在排序数组中搜索指定的元素。如果找到了该元素,则返回其索引;否则返回负数。

    java复制代码int[] arr = {1, 2, 3, 4};
    int index = Arrays.binarySearch(arr, 3);
    System.out.println("Index of 3: " + index);  // 输出:2
    

3、冒泡排序

冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!

  • 冒泡的代码还是相当简单的,两层循济,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。

  • 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(2)。

  • 冒泡排序

    1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置;
    2. 每一次比较,都会产生出一个最大,或者最小的数字;
    3. 下一轮则可以少一次排序!
    4. 依次循环,直到结束!
package com.xxsml.array;

import java.util.Arrays;

public class ArrayDemo07 {
    public static void main(String[] args) {
        int[] a = {1,3,43,5,63,2,54,28,6,12,43,22};

        //调用完我们自己写的排序方法以后,返回一个排序后的数组
        int[] sort = sort(a);

        System.out.println(Arrays.toString(sort));
    }
    public static int[] sort(int[] array){
        //临时变量
        int temp = 0;

        //外层循环,判断我们这个要走多少次
        for (int i = 0;i < array.length - 1;i++){
            //内层循环:比较这两个数,如果后一个大于前面一个,则交换位置
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j+1]>array[j]){
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
        return array;
    }
}

输出结果

[63, 54, 43, 43, 28, 22, 12, 6, 5, 3, 2, 1]

思考:如何优化?

package com.xxsml.array;

import java.util.Arrays;

public class ArrayDemo07 {
    public static void main(String[] args) {
        int[] a = {1,3,43,5,63,2,54,28,6,12,43,22};

        //调用完我们自己写的排序方法以后,返回一个排序后的数组
        int[] sort = sort(a);

        System.out.println(Arrays.toString(sort));
    }
    public static int[] sort(int[] array){
        //临时变量
        int temp = 0;

        //外层循环,判断我们这个要走多少次
        for (int i = 0;i < array.length - 1;i++){
            boolean flag = false; //通过flag标识位减少没有意义的比较
            //内层循环:比较这两个数,如果后一个大于前面一个,则交换位置
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j+1]>array[j]){
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                    flag = true;
                }
            }
            if(flag == false){
                break;
            }
        }
        return array;
    }
}

修改位置:第20行:boolean flag = false; //通过flag标识位减少没有意义的比较

第30~32行:

if(flag == false){
break;
}

第二段代码相对于第一段代码在性能上进行了优化,具体优化点在于使用了一个boolean类型的flag变量来减少不必要的比较。这是经典的冒泡排序算法的一个改进。

优化点如下:

  1. 减少不必要的比较:在冒泡排序中,如果某一趟遍历过程中没有进行任何交换(即数组已经有序或局部有序),那么之后的遍历将不会改变数组的顺序。因此,在第二段代码中,如果在某一趟遍历中没有发生交换(即flag仍为false),则直接跳出内层循环,结束这一趟的遍历。
  2. 时间复杂度的潜在降低:虽然冒泡排序的最坏时间复杂度仍然是O(n^2),但使用flag变量后,当数组已经有序或大部分有序时,算法会提前结束,从而减少了一些不必要的比较和交换操作,提高了效率。

当数组已经有序时,第一段代码仍然会进行完整的n-1趟遍历,而第二段代码在第一趟遍历后就会检测到没有发生交换,从而直接结束排序。

第二段代码通过引入flag变量来减少不必要的比较,提高了冒泡排序算法在数组已经有序或大部分有序时的性能。这是一个有效的优化,虽然不改变算法的最坏时间复杂度,但在实际应用中可能会带来显著的性能提升。

4、稀疏数组

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

在这里插入图片描述

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

稀疏数组介绍

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
  • 稀硫数组的处理方式是:
    • 记录数组一共有几行几列,有多少个不同值
    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 如下图:左边是原始数组,右边是稀疏数组

在这里插入图片描述

数组的应用

package com.xxsml.array;

public class ArrayDemo08 {
    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+"  ");
            }
            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++;
                    //把第2至最后一行也打出来了
                    array2[count][0] = i;  //第count行的第1个数存它的横坐标
                    array2[count][1] = j;  //第count行的第2个数存它的纵坐标
                    array2[count][2] = array1[i][j];  //第count行的第3个数存它的值
                }
            }
        }

        //输出稀疏数组
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0]+"  "
                              +array2[i][1]+"  "
                              +array2[i][2]+"  ");
        }

        System.out.println("=============");
        System.out.println("还原为原始的数组");
        //1、读取叙述数组的值
        int[][] array3 = new int[array2[0][0]][array2[0][1]]; //行为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]; //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+"  ");
            }
            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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七、Redis三种高级数据结构-HyperLogLog

Redis HyperLogLog是用来做基数统计的算法&#xff0c;HyperLogLog在优点是&#xff0c;在输入的元素的数量或者体积非常大时&#xff0c;计算基数占用的空间总是固定的、并且非常小。在Redis里每个HyperLogLog键只需花费12KB内存&#xff0c;就可以计算接近 264 个元素的基数。…

政安晨【零基础玩转各类开源AI项目】:基于Ubuntu系统本地部署使用GPT-SoVITS进行语音克隆与TTS语音生成

目录 介绍 什么是TTS 安装Miniconda 框架功能 测试通过的环境 开始 1. 安装好miniconda 2. 进入下载的GPT-SoVITS目录 3. 创建虚拟环境并执行脚本 4. 执行过程中可能会出错 5. 下载预训练模型 6. 训练过程中可能会报错 7. 使用过程中可能出错 8.以下是使用全过程…

Java入门基础学习笔记8——注释

1、注释&#xff1a; 注释是写在程序中对代码进行解释说明的文件&#xff0c;方便自己和其他人查看&#xff0c;以便理解程序的。 package cn.ensource.note;/**文档注释文档注释 */ public class NoteDemo {public static void main(String[] args) {// 单行注释System.out.…

Vue从入门到实战Day04

一、组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; 1. scoped样式冲突 默认情况&#xff1a;写在组件中的样式会全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式&#xff1a;默认组件中的样式会作用到全局 2. 局部样式&#xff1a;可以…

电脑开机显示器不亮?3大原因及解决办法

电脑开机后&#xff0c;显示器不亮是一个常见的问题&#xff0c;可能会给用户带来困扰。然而&#xff0c;这个问题通常并不复杂&#xff0c;可以通过一些简单的方法来解决。在本文中&#xff0c;我们将介绍三种常见的方法&#xff0c;帮助您解决电脑开机显示器不亮的情况。这些…

AI作画涉及的深度学习算法

AI作画中使用的深度学习算法多种多样&#xff0c;这些算法主要基于神经网络的结构和训练方式&#xff0c;以生成和改进艺术作品。以下是一些在AI作画中常用的深度学习算法&#xff1a; 生成对抗网络&#xff08;GANs, Generative Adversarial Networks&#xff09;&#xff1a…

vue3 antd-vue 超简单方式实现a-table跨页勾选

一、效果如下&#xff1a; 第一页勾选了2&#xff0c; 3&#xff0c; 4 翻到第三页勾选24&#xff0c; 25 回显&#xff0c;如比返回第一页的时候触发分页改变&#xff0c; 在映射中的第一页的数据给到a-table绑定的state.selectedRowKeys即可&#xff0c;如下方法 二、勾选思路…

【深度学习】Diffusion扩散模型原理解析1

1、前言 diffusion&#xff0c;这几年一直很火的模型&#xff0c;比如这段时间在网上的文生图大模型——Stable diffusion。就是以diffusion作为基底模型&#xff0c;但由于该模型与VAE那边&#xff0c;都涉及了较多了概率论知识&#xff0c;实在让人望而却步。所以&#xff0…

idea-自我快捷键-2

1. 书签 创建书签&#xff1a; 创建书签&#xff1a;F11创建特色标记书签&#xff1a;Ctrl F11快速添加助记符书签&#xff1a;ctrl shift 数字键 查看书签&#xff1a; shift F11快速定位到助记符书签&#xff1a;Ctrl 数字键 删除书签&#xff1a; delete 2. 自动…

Android使用Chaquo来运行Python的librosa的相关代码【有详细案例教程】

在某些情况下&#xff0c;我们可能需要在android上运行python的代码&#xff0c;那么常见的解释器有很多&#xff0c;目前比较成熟的就是chaquo&#xff0c;它适配的第三方机器学习的库很多&#xff0c;下面是它的简单使用教程 1.环境的搭建 1.1 在Android studio中新建安卓工…

SpringSecurity + JWT实现登录认证

前置基础请参考&#xff1a;SpringSecurity入门-CSDN博客 配置&#xff1a; pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></p…

网络1--通信过程的理解

1.封装与解包 通信的过程就是不断的封装和解包的过程 封装即就是按照“应用”“传输” “网络” “链路” 层&#xff0c;封装给每一层都加上相应的包头&#xff08;每一层都有协议&#xff0c;&#xff09;解包就是接受到的包文被一层层去掉相对应的包头。 任何一层的协议都…

【Qt】界面定制艺术:光标(cursor)、字体(font)、提示(toolTip)、焦点(focusPolicy)与样式表(styleSheet)的深度探索

文章目录 前言&#xff1a;1. cursor: 设置按钮的光标2. front&#xff1a;设置字体3. toolTip: 鼠标悬停提示4. focusPolicy&#xff1a;设置控件获取到焦点的策略5. styleSheet : 样式表总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;用户界面(UI)的设计和…

记录一些常用的网站

开发者搜索-Beta-让技术搜索更简单高效 (baidu.com)https://kaifa.baidu.com/JSON在线 | JSON解析格式化—SO JSON在线工具https://www.sojson.com/DCloud 插件市场https://ext.dcloud.net.cn/uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/在线学习书籍https://gi…

C++学习第三十课:C++异常处理机制应用

一、引言 在编程过程中&#xff0c;我们经常会遇到一些无法预见或难以预料的特殊情况&#xff0c;这些情况统称为“异常”。异常可能是由用户输入错误、资源不足、硬件故障或程序逻辑错误等原因引起的。当这些异常情况发生时&#xff0c;如果程序没有适当的处理机制&#xff0…

MySQL数据库表的创建DDL语句(21-25)

21.用户反馈表 CREATE TABLE 7_feedback (feedbackId int(11) NOT NULL AUTO_INCREMENT COMMENT ID,feedbackType int(4) NOT NULL DEFAULT 0 COMMENT 反馈类型&#xff0c;内容来自源系统基础数据表,userId int(11) DEFAULT NULL COMMENT 反馈者ID,creatTime datetime NOT NU…

商场综合体能源监管平台,实现能源高效管理

商场作为大型综合体建筑&#xff0c;其能源消耗一直是备受关注的问题。为了有效管理商场能耗&#xff0c;提高商场能源效率&#xff0c;商场综合体能源监管平台应运而生。 商场综合体能源监管平台可通过软硬件一起进行节能监管&#xff0c;硬件设备包括各种传感器、监测仪表和…

ArcGIS10.2系列许可到期解决方案

本文手机码字&#xff0c;不排版了。 昨晚&#xff08;2021\12\17&#xff09;12点后&#xff0c;收到很多学员反馈 ArcGIS10.2系列软件突然崩溃。更有的&#xff0c;今天全单位崩溃。 ​ 提示许可15天内到期。之前大部分许可是到2021年1月1日的。 ​ 后续的版本许可都是永久的…

哪些企业需要用OV 证书?怎么获取OV证书?看这里

OV证书相当于DV证书而言&#xff0c;其安全等级高&#xff0c;兼容性强&#xff0c;稳定性好&#xff0c;那么哪些企业适用OV证书呢&#xff1f; 1 政府与公共服务网站 政府机构及提供公共服务的网站&#xff0c;必须确保数据的隐私和安全&#xff0c;有助于增强公众对在线服务…

台服dnf局域网搭建,学习用笔记

台服dnf局域网搭建 前置条件虚拟机初始化上传安装脚本以及其他文件至虚拟机密钥publickey.pem客户端配置如果IP地址填写有误&#xff0c;批量修改IP地址 前置条件 安装有vmvarecentos7.6镜像&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/isos/x86…