Java数组(二)

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.toStringSystem.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://xiahunao.cn/news/3031712.html

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

相关文章

Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King 题面翻译 【题目描述】 佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格&#xff0c;呈 8 8 8\times8 88正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行&#xff…

只需3步,使用Stable Diffusion无限生成AI数字人视频(附安装包)

基本方法 搞一张照片&#xff0c;搞一段语音&#xff0c;合成照片和语音&#xff0c;同时让照片中的人物动起来&#xff0c;特别是头、眼睛和嘴。 语音合成 语音合成的方法很多&#xff0c;也比较成熟了&#xff0c;大家可以选择自己方便的&#xff0c;直接录音也可以&#…

一文了解Simhash原理和用法-计算文章相似度

Simhash原理 1&#xff1a;背景 SimHash算法是Google在2007年发表的论文《Detecting Near-Duplicates for Web Crawling》中提到的一种指纹生成算法&#xff0c;被应用在Google搜索引擎网页去重的工作之中。SimHash值不但提供了原始值是否相等这一信息&#xff0c;还能通过该…

PCIE协议-2-事务层规范---事务描述符

2.2.6.1 概览 事务描述符是请求者和完成器之间传输事务信息的机制。事务描述符由三个字段组成&#xff1a; 事务ID&#xff1a;标识未完成的事务属性字段&#xff1a;定义事务的特征流量类别&#xff08;TC&#xff09;字段&#xff1a;将事务与所需的服务类型关联起来 图2-…

C语言---使用共用体将double型经纬度存储到无符号数组中

1.在上报经纬度时由于数据协议限制需要将double型数据存储到无符号数组中&#xff0c;下边是写了一个简单C程序进行验证&#xff1b; 2.代码示例如下 #include <stdio.h> typedef union {float data;unsigned char arr[4]; } my_data;int main() {my_data test_data {…

【科学研究】在朋友圈上秀恩爱——“损人利己”

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【机器学习】 人工智能和机器学习辅助决策在空战中的未来选择

&#x1f680;传送门 &#x1f680;文章引言&#x1f512;技术层面&#x1f4d5;作战结构&#x1f308;替代决策选项&#x1f3ac;选项 1&#xff1a;超级战争&#xff08;Hyperwar&#xff09;&#x1f320;选项 2&#xff1a;超越OODA&#x1f302;选项 3&#xff1a;阻止其他…

C# OpenCvSharp Demo - 最大内接圆

C# OpenCvSharp Demo - 最大内接圆 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; namespace OpenCvSh…

祝贺!触想获评第二十一届“深圳知名品牌”

5月9日&#xff0c;第八届“深圳(湾区)国际品牌周”活动盛大开幕&#xff0c;会上公布并表彰了一批具有高创新力和竞争力的品牌名单。作为工控物联领域优秀品牌代表&#xff0c;触想智能与各级政府领导、国内外品牌界权威专家、知名企业领袖和企业代表同台共庆&#xff0c;并收…

麦肯锡专访 Mistral AI CEO:三五年后的工作,要比现在更有意义

【编者按】总部位于巴黎的人工智能初创公司 Mistral AI 成立仅一年&#xff0c;就被誉为现有大模型巨头的有力挑战者。 今年 2 月&#xff0c;Mistral AI 正式发布了旗舰级大模型 Mistral Large&#xff0c;直接对标 OpenAI 的 GPT-4&#xff1b;几周前&#xff0c;Mistral AI…

TriDet: Temporal Action Detection with Relative Boundary Modeling

标题&#xff1a;TriDet&#xff1a;采用相对边界建模的时间动作检测 原文链接&#xff1a;TriDet: Temporal Action Detection With Relative Boundary Modeling (thecvf.com)https://openaccess.thecvf.com/content/CVPR2023/papers/Shi_TriDet_Temporal_Action_Detection_W…

第五章 5.2【Java类和对象】---封装和构造方法

一、单个对象内存图 二、多个对象内存图 三、多个对象指向相同 四、成员变量和局部变量 4.1 成员变量&#xff1a; 在类里面&#xff0c;方法外面的变量 4.2 局部变量&#xff1a; 在方法中的变量 4.3下面的代码来演示&#xff1a; 4.4两者的区别 五、封装 六、构造方法 6.…

专题六_模拟(3)

目录 1419. 数青蛙 解析 题解 1419. 数青蛙 1419. 数青蛙 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int minNumberOfFrogs(string croakOfFrogs) {// 44.专题六_模拟_数青蛙_Cstring t "croak";int n t.size();vector<in…

RabbitMQ的用途

RabbitMQ主要有四个用途&#xff0c;分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下&#xff1a; RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦&#xff1a;提高系统容错性和可维护性 2.异步提速&#xff1a;提升用户体验…

减瘦误区、雷点、陷阱和挑战怎么应对

在减瘦过程中&#xff0c;很多肥胖人群都容易踩到坑。比如陷入误区&#xff0c;认为只有短期快速的减调方式方法&#xff0c;才值得尝试&#xff0c;而忽视身体健康&#xff1b;或是踩到雷点&#xff0c;轻信强速方剂或方法&#xff0c;结果身体产生了排斥或根本没效用白花钱&a…

4. 初探MPI——集体通信

系列文章目录 初探MPI——MPI简介初探MPI——&#xff08;阻塞&#xff09;点对点通信初探MPI——&#xff08;非阻塞&#xff09;点对点通信初探MPI——集体通信 文章目录 系列文章目录前言一、集体通信以及同步点二、MPI_Bcast 广播2.1 使用MPI_Send 和 MPI_Recv 来做广播2.…

2024美国虚拟信用卡申请流程

一、消费场景 二、如果申请 Fomepay美国虚拟信用卡 1.打开 Fomepay官方网站地址 2、登录之后根据自己的需求选择卡bin 3、点击申请卡&#xff0c;选择金额、填写姓名&#xff0c;选择微信/支付宝点击确认开卡即可 记得刷新页面哦~~~~~ 卡信息在卡中心cvc安全码里面 4、虚拟信…

一站式PDF解决方案:如何部署自己的PDF全能工具(Docker部署和群晖部署教程)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 开始部署 📒📝 Docker部署📝 群晖部署📝 本地安装⚓️ 相关链接 ⚓️📖 介绍 📖 在数字化办公的今天,PDF文件几乎成了我们日常工作中不可或缺的一部分。但你是否曾因为PDF文件的编辑、转换、合并等问题而头疼?如果…

面向对象设计之套路——设计模式

1、总则 面向对象的分析设计编程思想&#xff0c;通过封装、继承、多态把程序的耦合度降低&#xff0c;用设计模式使得程序更加灵活&#xff0c;容易修改&#xff0c;并且易于复用。 让业务逻辑与界面逻辑分开&#xff0c;让它们的耦合度下降&#xff0c;只有分离&#xff0c;…

气膜体育馆:有效防范PM2.5—轻空间

在现代城市生活中&#xff0c;雾霾天气频发&#xff0c;PM2.5污染日益严重&#xff0c;给人们的健康和生活带来了不小的困扰。而气膜体育馆作为一种新型的运动场所&#xff0c;不仅能够解决户外运动受到天气影响的问题&#xff0c;还具备有效防范PM2.5的功能。轻空间将带您探讨…