【Java探索之旅】掌握数组操作,轻松应对编程挑战

news2024/12/22 9:12:31
个人头像
🎥 屿小夏 : 个人主页
🔥个人专栏 : Java编程秘籍
🌄 莫道桑榆晚,为霞尚满天!

文章目录

  • 📑前言
  • 一、数组巩固练习
    • 1.1 数组转字符串
    • 1.2 数组拷贝
    • 1.3 求数组中的平均值
    • 1.4 查找数组中指定元素(顺序查找)
    • 1.5 查找数组中指定元素(二分查找)
    • 1.6 数组排序(冒泡排序)
    • 1.7 数组逆序
  • 🌤️全篇总结

📑前言

掌握数组的基本操作对于编写高效的程序至关重要。本文将深入探讨数组的一些常见操作,包括数组转字符串、数组拷贝、求平均值、顺序查找、二分查找、数组排序等。通过学习这些操作,您将更加熟练地处理数组,提高代码的质量和效率。

一、数组巩固练习

1.1 数组转字符串

import java.util.Arrays

int[] arr = {1,2,3,4,5,6};

String newArr = Arrays.toString(arr);
System.out.println(newArr);

// 执行结果
[1, 2, 3, 4, 5, 6]

使用了 java.util.Arrays 类中的 toString 方法。这个方法接收一个数组作为参数,并返回一个表示该数组的字符串。这个字符串是由数组元素的字符串表示形式组成,并使用逗号和空格分隔,并且整个字符串被方括号 [] 包围

使用这个方法后续打印数组就更方便一些

1.2 数组拷贝

import java.util.Arrays;
public static void func(){
    // newArr和arr引用的是同一个数组
    // 因此newArr修改空间中内容之后,arr也可以看到修改的结果
    int[] arr = {1,2,3,4,5,6};
    int[] newArr = arr;
    newArr[0] = 10;
    System.out.println("newArr: " + Arrays.toString(arr));
    
    // 使用Arrays中copyOf方法完成数组的拷贝:
    // copyOf方法在进行数组拷贝时,创建了一个新的数组
    // arr和newArr引用的不是同一个数组
    arr[0] = 1;
    newArr = Arrays.copyOf(arr, arr.length);
    System.out.println("newArr: " + Arrays.toString(newArr));
    
    // 因为arr修改其引用数组中内容时,对newArr没有任何影响
    arr[0] = 10;
    System.out.println("arr: " + Arrays.toString(arr));
    System.out.println("newArr: " + Arrays.toString(newArr));
    
    // 拷贝某个范围.
    int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
    System.out.println("newArr2: " + Arrays.toString(newArr2));
}

在这里插入图片描述在这里插入图片描述

Arrays.copyOf 是 Java 中 java.util.Arrays 类的一个静态方法,用于创建并返回数组的一个副本,可以指定副本数组的长度。如果新数组的长度大于原数组的长度,那么多余的元素会以默认值填充;如果新数组的长度小于原数组的长度,则只复制前部分元素。

Arrays.copyOf 方法的基本语法如下:

arr1_copy = Arrays.copyOf(arr1, new_length);
  • arr1:是需要拷贝的原数组。
  • new_length:是拷贝后的新数组的长度。如果不指定此参数,将使用原数组的长度。

Arrays.copyOf 返回的是一个新的数组对象,所以改变返回数组中的元素值不会影响原来的数组。

注意:数组当中存储的是基本类型数据时,不论怎么拷贝基本都不会出现什么问题,但如果存储的是引用数据类
型,拷贝时需要考虑深浅拷贝的问题,后面文章会进行讲解。

实现自己版本的拷贝数组

public static int[] copyOf(int[] arr) {
    int[] ret = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
    	ret[i] = arr[i];
    } 
    return ret;
}

1.3 求数组中的平均值

给定一个整型数组, 求平均值

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5,6};
    System.out.println(avg(arr));
}
public static double avg(int[] arr) {
    int sum = 0;
    for (int x : arr) {
    sum += x;
} 
    return (double)sum / (double)arr.length;
} 
// 执行结果
3.5

1.4 查找数组中指定元素(顺序查找)

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置

public static void main(String[] args) {
    int[] arr = {1,2,3,10,5,6};
    System.out.println(find(arr, 10));
}
public static int find(int[] arr, int data) {
    for (int i = 0; i < arr.length; i++) {
    	if (arr[i] == data) {
    	return i;
	}
// 表示没有找到
    return -1;
} 
// 执行结果
3

1.5 查找数组中指定元素(二分查找)

针对有序数组, 可以使用更高效的二分查找

有序分为 “升序” 和 “降序”
如 1 2 3 4 , 依次递增即为升序.
如 4 3 2 1 , 依次递减即为降序

以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较:

  • 如果相等,即找到了返回该元素在数组中的下标
  • 如果小于,以类似方式到数组左半侧查找
  • 如果大于,以类似方式到数组右半侧查找
public static void main(String[] args) {
	int[] arr = {1,2,3,4,5,6};
	System.out.println(binarySearch(arr, 6));
}

public static int binarySearch(int[] arr, int toFind) {
    int left = 0;
    int right = arr.length - 1;
    
    while (left <= right) {
        int mid = (left + right) / 2;
    	if (toFind < arr[mid]) {
    		// 去左侧区间找
    		right = mid - 1;
    	} else if (toFind > arr[mid]) {
    	// 去右侧区间找
    		left = mid + 1;
    	} else {
    	// 相等, 说明找到了
    		return mid;
    	}
    } 
    // 循环结束, 说明没找到
    return -1;
} 
// 执行结果
5

这个查找的效率还是很高效的,一次就可以砍掉一半的数据,并且在数据越大的时候越有优势。

1.6 数组排序(冒泡排序)

给定一个数组, 让数组升序 (降序) 排序.
算法思路

假设排升序:

  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾

  2. 依次从上上述过程,直到数组中所有的元素都排列好

在这里插入图片描述

public static void main(String[] args) {
    int[] arr = {9, 5, 2, 7};
    bubbleSort(arr);
    System.out.println(Arrays.toString(arr));
}

public static void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = 1; j < arr.length-i; j++) {
            if (arr[j-1] > arr[j]) {
                int tmp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = tmp;
			}
        }
    } // end for
} // end bubbleSort
// 执行结果
[2, 5, 7, 9]

冒泡排序性能较低. Java 中内置了更高效的排序算法

public static void main(String[] args) {
	int[] arr = {9, 5, 2, 7};
	Arrays.sort(arr);
	System.out.println(Arrays.toString(arr));
}

关于 Arrays.sort 的具体实现算法,后期会有专门的篇章来讲解。

1.7 数组逆序

给定一个数组, 将里面的元素逆序排列.

思路

  • 设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.
  • 然后让前一个下标自增, 后一个下标自减, 循环继续即可
public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4};
    reverse(arr);
    System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] arr) {
    int left = 0;
    int right = arr.length - 1;
    
    while (left < right) {
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
	}
}

🌤️全篇总结

通过本篇的学习,您已经掌握了Java数组的一些重要操作技巧,包括数组转字符串、数组拷贝、求平均值、顺序查找、二分查找、数组排序和数组逆序等。这些操作对于日常编程和算法设计都具有重要意义,希望您能够灵活运用这些技巧,提升自己的编程能力。

在这里插入图片描述

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

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

相关文章

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么&#xff1f;2、nvm是什么&#xff1f; 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

书生·浦语大模型实战营之Lagent AgentLego 智能体应用搭建

书生浦语大模型实战营之Lagent & AgentLego 智能体应用搭建 Lagent 简介 Lagent 是一个轻量级开源智能体框架&#xff0c;旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、R…

【系统分析师】应用数学部分

文章目录 1、图论应用1.1 最小生成树1.2 最短路径1.3 网络与最大流量 2、运筹方法2.1 关键路径法2.2 线性规划2.3 动态规划2.4 预测与决策2.4.1 囚徒困境2.4.2 实例&#xff1a;商业竞争 2.5 状态转移矩阵2.6 排队论2.7 决策2.7.1 决策2.7.2不确定型决策2.7.3 决策树2.7.4 决策…

4.17号驱动

中断子系统 1. 中断工作原理 1.1 异常处理流程 保存现场(cpu自动完成) 保存cpsr寄存器中的值&#xff0c;到spsr_寄存器中 修改cpsr寄存器中的值 修改状态位(T位) 根据需要禁止相应的中断位(I/F) 修改对应模式位 保存函数的返回地址到lr寄存器中 修改pc指向异常向量表 …

Realsense D455 调试

1 Realsense D455 配置&#xff1a; RGB&#xff1a;彩色相机&#xff0c;FOV&#xff08;h&#xff0c;v&#xff09;&#xff08; 90*65 &#xff09;红外点阵发射&#xff1a;位于上图中RGB右边&#xff0c;发射特定模式的红外光&#xff0c;通常是一种点阵图案&#xff0c…

深度学习架构(CNN、RNN、GAN、Transformers、编码器-解码器架构)的友好介绍。

一、说明 本博客旨在对涉及卷积神经网络 &#xff08;CNN&#xff09;、递归神经网络 &#xff08;RNN&#xff09;、生成对抗网络 &#xff08;GAN&#xff09;、转换器和编码器-解码器架构的深度学习架构进行友好介绍。让我们开始吧&#xff01;&#xff01; 二、卷积神经网络…

Dryad Girl Fawnia

一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色,幻想或装扮游戏。 🔥 Dryad Girl | Fawnia 一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色…

网络攻防演练:一场针锋相对的技术博弈与安全防护实践

随着ChatGPT5的即将上线&#xff0c;其安全防护能力面临更为严峻的考验。网络攻防演练作为检验系统安全性能、提升防御体系的关键环节&#xff0c;对于确保ChatGPT5的安全稳定运行具有重要意义。本文将深入探讨网络攻击与防守之间的动态关系&#xff0c;并提供在网络攻防演练中…

【Leetcode每日一题】 分治 - 颜色分类(难度⭐⭐)(57)

1. 题目解析 题目链接&#xff1a;75. 颜色分类 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路解析 本算法采用三指针法&#xff0c;将数组划分为三个区域&#xff0c;分别用于存放值为0、1和2的元素。通过…

vivado 设置 VIO 核以执行测量、查看 VIO 核状态

设置 VIO 核以执行测量 您添加到自己的设计中的 VIO 核会显示在“硬件 (Hardware) ”窗口中的目标器件下。如果未显示这些 VIO 核 &#xff0c; 请右键 单击器件并选择“ Refresh Hardware ”。这样将重新扫描 FPGA 或 ACAP 并刷新“ Hardware ”窗口。 注释 &#xff…

【免费】基于SOE算法的多时段随机配电网重构方法

1 主要内容 该程序是完全复现《Switch Opening and Exchange Method for Stochastic Distribution Network Reconfiguration》&#xff0c;也是一个开源代码&#xff0c;网上有些人卖的还挺贵&#xff0c;本次免费分享给大家&#xff0c;代码主要做的是一个通过配电网重构获取…

“面包板”是什么?有啥用?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

一种范围可调式测径仪 满足生产各规格检测!

摘要&#xff1a;范围可调式测径仪&#xff0c;满足各种外径尺寸的产品检测&#xff0c;囊括产线的所有规格&#xff0c;性价比更高的测径仪。 关键词&#xff1a;测径仪,范围可调测径仪,在线测径仪 引言 生产线中&#xff0c;各种外径尺寸的线材、棒材、管材都有生产&#xff…

【SAP NWDI】服务开启:SLD,CM,CMS(二)

一、启用System Landscape Directory 二、启用 NWDI using CMS

CAN的底层驱动

框架图 拆解链路模型 CAN子系统 can_controller Core 包含协议控制器和接收/发送移位寄存器。它可处理所有 ISO 11898-1: 2015 协议功能,并支持 11 位和 29 位标识符。

一、基础算法-快速排序

1.快速排序 快速排序主要利用了分治的思想&#xff0c;具体步骤为&#xff1a; step1 确定分界点&#xff0c;常用为q[left],q[right],q[mid]&#xff0c;也可以是随机的 step2 调整区间&#xff0c;将比分界点小的放左边&#xff0c;大的放右边 step3 利用递归处理左右两端 …

嵌入式Linux串口通信

嵌入式板子就和普通用的单片机比如stm32开发板&#xff0c;51开发板差不多&#xff0c;他们的串口都很类似&#xff0c;都是直接连上然后在PC机器上用串口软件打开就好了。 我使用的嵌入式开发板上面有8个rs485串口&#xff0c;2个rs232串口以及一个网口&#xff0c;刚开始开发…

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…

<计算机网络自顶向下> 多路复用与解复用

多路复用/解复用 端口号区分进程到进程多路解复用工作原理 解复用作用&#xff1a;TCP或者UDP实体采用哪些信息&#xff0c;将报文段的数据部分交给正确的socket&#xff0c;从而交给正确的进程主机收到IP数据报 每个数据报有源IP地址和目标地址每个数据报承载一个传输层报文段…

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…