一维数组、多维数组、Array(deepToString sort fill binarySearch)方法2024122620241226

news/2024/12/26 23:41:30/文章来源:https://www.cnblogs.com/panghuhu-space/p/18634401

数组20241226

[数组详情](深入理解 Java 数组 - 静默虚空 - 博客园)

什么是数组:

数组是相同类型数据的有序集合

  • 注意:必须是相同数据

数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素。

每个数组元素可以通过一个下标来访问它们.

image-20241226164550840
类似创建了一个足球队数组,通过号码来对应球员

数组的内存模型

数组是存储多个相同类型变量的对象。数组的所有元素保存在堆内存中==
•数组创建后立即拥有默认值。
•索引从0开始。

graph LR A[Java内存]==>B[堆] A[Java内存]==>C[栈] A[Java内存]==>D[方法区] B[堆]==>E[存放new的对象和数组] B[堆]==>F[可以被所有的线程共享,不会存放别的对象引用] C[栈]==>G[存放(8种)基本变量类型(会包含这个基本类型变量的具体的值)] C[栈]==>H[引用对象的变量(会存放这个引用在堆里面的具体地址)] D[方法区]==>I[可以被所有的线程共享] D[方法区]==>J[包含了所有的class和static变量]

数组的声明和创建

两种声明方式

  1. 数组类型[] 数组名 //首选这种,第二种是迎合C语言
  2. 数组类型 数组名[]

数组的定义

1.数组类型 [] 数组名 = new 数组类型[数组长度] (常规定义)

int[] numbers01 = new int[10];
float[] numbers02 = new float[5];

2.数组类型 数组名[ ] = {元素1,元素2,…}

int[] number03 ={1,2,4,7,87};
float[] number04 ={1.0,32.3,23.6,7.2}

注意

int[] a;
a = new int[5] ;

等同于

int[] a = new int[5];

数组中的常见异常

// 异常一:数组没有创建
int a[] = null;
a[0] = 1;
System.out.println(a[0]);

输出空指针报错:java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerExceptionat com.pangHuHuStudyJava.arrays.Demo02.main(Demo02.java:6)
// 异常二:下标越界
int a[] = { 1, 2, 3 };
System.out.println(a[3]);

输出数组指针越界! java.lang.ArrayIndexOutOfBoundsException

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5at com.pangHuHuStudyJava.arrays.Demo02.main(Demo02.java:8)

动态初始化(先定义再赋值)第9到第18行

package com.pangHuHuStudyJava.arrays;
import java.sql.SQLOutput;
//数组的创建、计算数组所有元素之和
public class Demo01 {
public static void main(String[] args) {int[] numbers01;numbers01 = new int[10];//定义数组  //等于 int[]  numbers01=new int[10];//给数组赋值  动态初始化numbers01[0] = 1;numbers01[1] = 2;numbers01[2] = 3;numbers01[3] = 4;numbers01[4] = 5;numbers01[5] = 6;numbers01[6] = 7;numbers01[7] = 8;numbers01[8] = 9;numbers01[9] = 10;//直接赋值//用array.length 来输出下数组的最大值和求和float[] numbers02 = new float[5];定义数组  //等于 int[]  numbers01=new int[10];double[] numbers03 = {12.2,3.2,5.2,312.3,2,23.2,332.2,4455.2};//直接定义double max=0;//请一定注意 局部变量在使用前无比赋明确的初值double sum=0 ;//请一定注意 局部变量在使用前无比赋明确的初值for (int i = 0; i < numbers03.length; i++) {max = numbers03[i];sum += numbers03[i];if(max < numbers03[i]){max=numbers03[i];}}System.out.println("数组三的最大值:"+max);System.out.println("数组三的和:"+sum);
}
}

输出:

数组三的最大值:4455.2
数组三的和:5145.5

数组的三种初始化方式

1.静态初始化:

int[] number03 ={1,2,4,7,87};
float[] number04 ={1.0,32.3,23.6,7.2}

2.动态初始化(包含默认初始化)

int[]  numbers01=new int[10];//给数组赋值  动态初始化numbers01[0] = 1;numbers01[1] = 2;numbers01[2] = 3;numbers01[3] = 4;numbers01[4] = 5;numbers01[5] = 6;

数组的四个基本特点

长度是确定的数组一旦被创建,它的大小就是不可以改变的。
其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型包括基本类型和引用类型数组变量属引用类型数组也可以看成是对象数组中的每个元素相当于该对象的成员变量
数组本身就是对象Java中对象是在堆中的因此数组无论保存原始类型还是其他对象类型数组对象本身是在堆中的。

数组的边界

下标的合法区间:[0,length-1] 如果越界就会报错 java.lang.ArrayIndexOutOfBoundsException

◆小结:
数组是相同数据类型(数据类型可以为任意类型)的有序集合数组也是对象。
数组元素相当于对象的成员变量
数组长度的确定的,不可变的如果越界,则报:ArrayIndexOutofBounds

数组的使用

1.简单for +array.length

2.增强型for循环 实现一个数组翻转

package com.pangHuHuStudyJava.arrays;
import java.util.Arrays;
// 数组的使用:增强型 for 循环
// 本程序实现了数组的反转,并打印原始数组和反转后的数组
public class Demo03 {public static void main(String[] args) {// 定义一个数组并静态初始化int[] numbers = {7, 3, 6, 11, 43, 1, 10, 4, 21, 10}; // 获取数组的长度int count = numbers.length; // 定义一个新的数组,用于存储反转后的数组int[] numberCopy = new int[count]; // 使用 for 循环将原数组的元素从后往前赋值到新数组中for (int i = 0; i < count; i++) {numberCopy[i] = numbers[count - i - 1]; }// 输出原始数组的元素System.out.println("原始数组的元素为:"); for (int number : numbers) { // 使用增强型 for 循环遍历数组System.out.print(number + " "); }// 输出反转后的数组元素System.out.println("\n反转后数组的元素为:"); for (int number : numberCopy) { // 使用增强型 for 循环遍历反转后的数组System.out.print(number + " "); }}
}

如果需要更简洁的方式,可以直接使用Arrays.toString()打印数组内容:

System.out.println("原始数组的元素为:" + Arrays.toString(numbers));
System.out.println("反转后数组的元素为:" + Arrays.toString(numberCopy));

这会直接将数组的所有元素以字符串形式输出,例如:

原始数组的元素为:[7, 3, 6, 11, 43, 1, 10, 4, 21, 10]
反转后数组的元素为:[10, 21, 4, 10, 1, 43, 11, 6, 3, 7]
改进下:做一个函数封装,这里涉及一个数组的返回,C有一个返回的数组名(数组的地址)
package com.pangHuHuStudyJava.arrays;
// 对 Demo03 的功能进行函数封装,增加代码复用性
// 本程序实现了数组反转功能,并通过函数返回反转后的数组
public class Demo04 {public static void main(String[] args) {// 定义一个数组并静态初始化int[] numbers = {7, 3, 6, 11, 43, 1, 10, 4, 21, 10};// 调用封装好的函数 arrayFlip 对数组进行反转,并打印反转后的数组元素for (int i : arrayFlip(numbers)) { // 直接使用增强型 for 循环输出反转结果System.out.print(i + " ");}}/*** 定义一个静态方法,用于反转数组** @param array 传入的整型数组* @return 返回反转后的数组*/public static int[] arrayFlip(int[] array) {// 获取数组长度int count = array.length;// 创建一个新数组用于存放反转结果int[] result = new int[count];// 使用循环将原数组从后往前赋值到新数组中for (int i = 0; i < count; i++) {result[i] = array[count - 1 - i];}// 返回反转后的数组return result;}
}
chatgpt 改进:

减少不必要的数组复制

如果允许直接修改原数组,可以省去创建新数组的开销: 注意这里直接把原数组翻转!!!

public static void arrayFlipInPlace(int[] array) {int left = 0,;int right = array.length - 1;while (left < right) {int temp = array[left];array[left] = array[right];array[right] = temp;left++;right--;}return array;
}

多维数组、Array(sort fill binarySearch)方法20241226

多维数组定义、赋值、理解

二维数组定义与初始化

  • 动态初始化:先定义数组大小,然后逐个赋值。
  • 静态初始化:直接定义并赋值,适用于已知数据的场景。

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

二维数组

int\[][] a[][]= new int\[2][5];

理解:

image-20241226210758092

三维数组 numbers02[2][6][5]

未命名文件

遍历二维数组

  • 增强 for 循环:适合简单遍历,不关心索引时使用。
  • 标准 for 循环:适合需要操作索引或灵活控制遍历时使用。

使用 Arrays.toString()

  • Arrays.toString(array) 用于将一维数组转换为字符串格式,方便输出。
package com.pangHuHuStudyJava.arrays;
import java.util.Arrays; // 引入 Arrays 工具类
// 多维数组的定义、赋值与展示,使用增强 for 循环和标准 for 循环
public class Demo05 {public static void main(String[] args) {// 定义一个 2x2 的二维数组,并动态初始化int[][] numbers = new int[2][2]; numbers[0][0] = 1; // 为二维数组的第 0 行第 0 列赋值numbers[0][1] = 2; // 为二维数组的第 0 行第 1 列赋值numbers[1][0] = 3; // 为二维数组的第 1 行第 0 列赋值numbers[1][1] = 4; // 为二维数组的第 1 行第 1 列赋值// 使用静态初始化方式定义一个二维数组int[][] numbers02 = {{1, 2, 5}, {3, 4, 6}};// 增强 for 循环遍历二维数组System.out.println("增强 for 循环遍历二维数组");for (int[] ints : numbers02) { // 遍历每一行for (int anInt : ints) { // 遍历当前行的每个元素System.out.print(anInt + " "); // 输出当前元素}System.out.println(); // 换行}System.out.println("=========================");// 标准 for 循环遍历二维数组System.out.println("标准 for 循环遍历二维数组");for (int i = 0; i < numbers02.length; i++) { // 遍历每一行for (int j = 0; j < numbers02[i].length; j++) { // 遍历当前行的每个元素System.out.print(numbers02[i][j] + " "); // 输出当前元素}System.out.println(); // 换行}System.out.println("=============");// 使用 Arrays 类中的方法将二维数组的每一行转换为字符串System.out.println("使用 Arrays 类中的方法实现 toString");for (int i = 0; i < numbers02.length; i++) { System.out.print(Arrays.toString(numbers02[i]) + " "); // 将当前行转为字符串并输出System.out.println(); // 换行}}
}
增强 for 循环遍历二维数组
1 2 5 
3 4 6 
=========================
标准 for 循环遍历二维数组
1 2 5 
3 4 6 
=============
使用 Arrays 类中的方法实现 toString
[1, 2, 5] 
[3, 4, 6] 

掌握 Arrays 工具类的常用方法,如 toString()deepToString()(用于打印多维数组)。

Arrays.deepToString()是 Java 提供的一个工具方法,用于将多维数组的内容转换为字符串格式。与Arrays.toString()不同,它可以处理多维数组,并递归地对所有嵌套数组进行字符串化。

public static String deepToString(Object[] array)

功能

  • 将多维数组的每个元素(包括嵌套的数组)转换为字符串。
  • 生成的字符串格式类似于嵌套的方括号结构 [[], []],表示数组的层级。

toString() 的区别

  1. Arrays.toString()
    • 仅支持一维数组。
    • 如果传入多维数组,会直接输出对象的内存地址,如 [I@5e91993f
  2. Arrays.deepToString()
    • 支持多维数组。
    • 递归遍历所有嵌套数组,输出层级结构。

示例对比:

int[][] numbers = {{1, 2, 3}, {4, 5, 6}};
System.out.println(Arrays.toString(numbers));       // 输出:[[I@5e91993f, [I@1c4af82c]
System.out.println(Arrays.deepToString(numbers));  // 输出:[[1, 2, 3], [4, 5, 6]]

作业:

◆ 具有以下常用功能:
给数组赋值:通过 fill方法。
对数组排序:通过 sort 方法,按升序。
比较数组:通过 equals 方法比较数组中元素值是否相等
deepToString()将多维数组的每个元素(包括嵌套的数组)转换为字符串。

◆查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

package com.pangHuHuStudyJava.arrays;
import java.util.Arrays;
//熟悉Arrays类各种方法:deepToString, fill, sort, equals, binarySearch
//重点演示:deepToString 将多维数组的每个元素(包括嵌套的数组)转换为字符串,生成的字符串格式类似于嵌套的方括号结构 `[[], []]`
public class Demo06 {public static void main(String[] args) {// 使用 deepToString 方法输出二维数组System.out.println("deepToString 输出二维数组:");// 定义一个二维数组 numbers[3][3]int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};// 打印二维数组的内容System.out.println(Arrays.deepToString(numbers));// 定义一个三维数组 numbers02[2][3][5]int[][][] numbers02 = {{{4, 2, 4, 5, 6},{12, 3, 5, -2, 4},{23, 32, 5, 45, 65}},{{1, 2, 3, 4, 5},{6, 7, 8, 9, 10},{11, 12, 13, 14, 15}}};// 使用 deepToString 方法输出三维数组System.out.println("deepToString 输出三维数组:");System.out.println(Arrays.deepToString(numbers02));}
}
deepToString 输出二维数组:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
deepToString 输出三维数组:
[[[4, 2, 4, 5, 6], [12, 3, 5, -2, 4], [23, 32, 5, 45, 65]], [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]]

Arrays.sort方法

package com.pangHuHuStudyJava.arrays;
import java.util.Arrays;
//熟悉Arrays中的方法 fill sort
public class Demon07 {public static void main(String[] args) {int[] numbers = {2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65};System.out.println("原始数组:" + Arrays.toString(numbers));Arrays.sort(numbers);System.out.println("排序(正序)后数组:" + Arrays.toString(numbers));//倒序有点问题  要用到自定义比较器/*   Integer[] array = {1, 3, 2, 5, 4};//这里使用的是 Integer[],而不是 int[],因为 Comparator 只支持对象类型// 使用自定义比较器实现倒序Arrays.sort(array, (a, b) -> b - a);*///所以我自己再写一个倒序(正序再翻转就行了)arrayReverse(numbers);//正序后再翻转,实现倒序System.out.println("排序(倒序)后数组:" + Arrays.toString(numbers));}public static void arrayReverse(int[] array){//这种方法时间复杂度为 O(n)O(n)O(n),空间复杂度为 O(1)O(1)O(1),非常高效。int left=0;int right= array.length-1;while(left<right){int temp = array[left];array[left] = array[right];array[right] = temp;left++;right--;}}
}

输出结果:

原始数组:[2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65]
排序(正序)后数组:[-234, -23, 2, 3, 5, 10, 12, 65, 76, 231, 435]
排序(倒序)后数组:[435, 231, 76, 65, 12, 10, 5, 3, 2, -23, -234]

Array.fill方法

package com.pangHuHuStudyJava.arrays;
import java.util.Arrays;
public class Demo08 {public static void main(String[] args) {// 示例 1:整体填充int[] array1 = {2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65};System.out.println("原始数组 array1:" + Arrays.toString(array1));// 将整个数组填充为 0Arrays.fill(array1, 0);System.out.println("执行 Arrays.fill(array1, 0) 后的数组:" + Arrays.toString(array1));System.out.println("------------------------------------------------");// 示例 2:部分区间填充int[] array2 = {2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65};System.out.println("原始数组 array2:" + Arrays.toString(array2));// 填充区间 [1, 4) 的元素为 666Arrays.fill(array2, 1, 4, 666);System.out.println("执行 Arrays.fill(array2, 1, 4, 666) 后的数组:" + Arrays.toString(array2));}
}

输出结果:

原始数组 array1:[2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65]
执行 Arrays.fill(array1, 0) 后的数组:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
------------------------------------------------
原始数组 array2:[2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65]
执行 Arrays.fill(array2, 1, 4, 666) 后的数组:[2, 666, 666, 666, -23, 3, 76, 231, 435, -234, 65]

Arrays.binarySearch方法

package com.pangHuHuStudyJava.arrays;
import java.util.Arrays;
// 使用 binarySearch 方法查找数组中的数
public class Demo09 {public static void main(String[] args) {int[] numbers = {2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65};System.out.println("原始数组:" + Arrays.toString(numbers));// 在查找之前必须排序数组Arrays.sort(numbers);System.out.println("排序后的数组:" + Arrays.toString(numbers));// 查找数值 5 的位置int[] target ={-666,4,10000};calbinarySearch(numbers,target);}public static void calbinarySearch(int[] array,int[] target) {//请确保 传入的array 是排好序的数组for (int i : target) {int result = Arrays.binarySearch(array, i);if (result >= 0) {System.out.println("数值 " + i + " 在数组中的索引为:" + result);} else {System.out.println("数值 " + i + " 不存在,返回值为:" + result);int insertionPoint = -(result + 1);System.out.println("如果插入,数值 " + i + " 应插入到索引位置:" + insertionPoint);}}}
}
原始数组:[2, 5, 10, 12, -23, 3, 76, 231, 435, -234, 65]
排序后的数组:[-234, -23, 2, 3, 5, 10, 12, 65, 76, 231, 435]
数值 -666 不存在,返回值为:-1
如果插入,数值 -666 应插入到索引位置:0
数值 4 不存在,返回值为:-5
如果插入,数值 4 应插入到索引位置:4
数值 10000 不存在,返回值为:-12
如果插入,数值 10000 应插入到索引位置:11

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《计算机组成及汇编语言原理》阅读笔记:p116-p120

《计算机组成及汇编语言原理》学习第 7 天,p116-p120 总结,总计 5 页。 一、技术总结 1.CPU优化 (1)increase overall performance number 例如:16位电脑提升到32位电脑。 (2)multiprocessing One way to make computers more useful is to allow them to run more than on…

波折重重:Linux实时系统Xenomai宕机问题的深度定位过程

本文将带您深入了解一个与之相关的真实事故现场及其问题定位过程,波折重重,其中的xenomai问题定位思路具有一定借鉴意义,希望对你定位xenomai问题有所帮助。目录一 前言二 背景三 原因分析及措施硬件原因应用软件操作系统四 分析定位转机拨云见雾irq计数Schedstatcoreclk现象…

Java面向对象程序设计复习总结

作者:高世栋 学号:202302151071 一、第一章:初识Java与面向对象程序设计Java简介:Java是一种面向对象的程序设计语言,具有跨平台、安全性高、可移植性强等特点。面向对象程序设计概述:面向对象是一种程序设计思想,将现实世界的事物抽象为对象,通过对象之间的交互来完…

[Paper Reading] StegoType: Surface Typing from Egocentric Cameras

目录StegoType: Surface Typing from Egocentric CamerasTL;DRData数据采集设备开环数据收集闭环数据收集数据容错机制OracleMethodInput FeaturesBackboneDataLossExperiment效果可视化总结与思考相关链接Related works中值得深挖的工作资料查询 StegoType: Surface Typing fr…

JVM实战—2.JVM内存设置与对象分配流转

大纲 1.JVM内存划分的原理细节 2.对象在JVM内存中如何分配如何流转 3.部署线上系统时如何设置JVM内存大小 4.如何设置JVM堆内存大小 5.如何设置JVM栈内存与永久代大小 6.问题汇总1.JVM内存划分的原理细节 (1)背景引入 (2)大部分对象的存活周期都是极短的 (3)少数对象是长期存活…

【Obsidian】 博客园插件

搬运 原文作者:ZhangBlog 出处:https://www.cnblogs.com/aaalei/p/17926199.html由于 Markdown 语法的便捷性, 我们从繁重的排版布局工作中解脱出来, 越来越多的人开始接受这种写作方式, 该插件可以将你的 md 笔记, 方便的同步到博客园中, 即使你是使用的本地图片, 也无须担心…

【数据分析】如何构建数据分析体系?

一、数据分析体系的重要性二、如何搭建数据分析体系三、数据分析体系如何量体裁衣编者荐语: 很详细 以下文章来源于ruby的数据漫谈 ,作者ruby 摘要:在当今数字化时代,数据已成为企业决策和发展的重要依据。构建一个完善的数据分析体系,能够帮助企业从海量数据中挖掘价值,…

DDD你真的理解清楚了吗?怎么准确理解“值对象”

DDD你真的理解清楚了吗?我通过这一系列知识分享,让大家真正准确地理解DDD中这些晦涩的概念,今天探讨“值对象”这些年,随着软件业的不断发展,软件系统开始变得越来越复杂而难于维护。这时,越来越多的开发团队开始选择实践DDD领域驱动设计。领域驱动设计是一种非常优秀的软…

【AI+安全】sshd后门自动化检测 | BinaryAI在恶意软件检测场景的实践

原创 腾讯科恩实验室 腾讯科恩实验室 2024年11月12日 10:12 上海 一、引言 在网络安全攻防对抗中,攻击者经常通过在系统关键组件中植入后门程序,来获取持久的访问权限。sshd (SSH daemon) 作为管理远程登录的核心服务,是攻击者常用的目标之一。攻击者通过修改或者替sshd二进…

用Detr训练自定义数据

前面记录了Detr及其改进Deformable Detr。这一篇记录一下用Detr训练自己的数据集。先看下Detr附录中给出的大体源码,整体非常清晰。接下来记录大体实现过程 一、数据准备 借助labelme对数据进行标注然后将标注数据转换成COCO格式,得到以下几个文件其中JPEGImages存放所有图片…

8086汇编(16位汇编)学习笔记05.asm基础语法和串操作

https://bpsend.net/thread-121-1-2.htmlasm基础语法 1. 环境配置xp环境配置 1.拷贝masm615到指定目录 2.将masm615目录添加进环境变量 3.在cmd中输入ml,可以识别即配置成功dosbox环境配置 1.拷贝masm611到指定目录 2.将masm611所在目录添挂载进dosbox 3.将masm611目录在dosbo…

WinNTSetup 系统安装利器 v5.4.0 单文件版

软件介绍 WinNTSetup,系统安装利器,目前最好用的系统安装器,Windows系统安装部署工具。支持所有Windows平台,支持多系统安装、完全格式化C盘、支持创建VHD虚拟硬盘、在Windows及PE系统下运行,允许在安装前对系统进行预优化设置、集成驱动程序、启用第三方主题支持、加入无…