Java数组篇[5]:数组的排序和查找

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在处理数组数据时,排序和查找是两个非常基本且重要的操作。排序可以帮助我们组织数据,而查找可以让我们快速定位到特定的数据项。

摘要

本文将介绍Java中数组排序和查找的方法,包括使用Java标准库中的Arrays类以及自定义排序和查找算法。

概述

排序算法有多种,如冒泡排序、选择排序、插入排序等,而查找则通常使用线性查找或二分查找。Java的Arrays类提供了一些方便的方法来对数组进行排序和二分查找。

数组排序

使用Arrays.sort()

Java的Arrays类提供了一个静态方法sort(),可以对数组进行排序。

import java.util.Arrays;int[] numbers = {5, 3, 8, 6, 2};
Arrays.sort(numbers);

自定义排序算法

你也可以实现自己的排序算法,例如冒泡排序。

void bubbleSort(int[] array) {boolean swapped;for (int i = 0; i < array.length - 1; i++) {swapped = false;for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]) {// Swap elementsint temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;swapped = true;}}if (!swapped) break; // No need to continue if the array is already sorted}
}

数组查找

使用Arrays.binarySearch()

如果数组已经排序,可以使用Arrays.binarySearch()方法进行高效的查找。

int index = Arrays.binarySearch(numbers, targetValue);
if (index < 0) {System.out.println("元素未找到");
} else {System.out.println("元素位置: " + index);
}

线性查找

对于未排序的数组,可以使用线性查找来定位元素。

int linearSearch(int[] array, int target) {for (int i = 0; i < array.length; i++) {if (array[i] == target) {return i; // 元素找到,返回索引}}return -1; // 元素未找到,返回-1
}

使用案例分享

假设我们需要对用户输入的一系列数字进行排序,并查找特定的数字。

Scanner scanner = new Scanner(System.in);
int[] userInputs = new int[5];
for (int i = 0; i < userInputs.length; i++) {userInputs[i] = scanner.nextInt();
}
Arrays.sort(userInputs); // 对输入的数字进行排序int target = scanner.nextInt(); // 用户希望查找的数字
int index = Arrays.binarySearch(userInputs, target);
// 打印查找结果...

  针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码演示了如何从用户那里接收一系列整数输入,将这些输入存储在数组中,对数组进行排序,然后使用二分查找算法查找用户指定的目标值。下面是对代码的逐行解释以及如何完善它以打印查找结果:

  1. Scanner scanner = new Scanner(System.in);:创建一个Scanner对象,用于从标准输入(通常是键盘)读取数据。

  2. int[] userInputs = new int[5];:声明并初始化一个长度为5的整型数组userInputs,用于存储用户的输入。

  3. 接下来的for循环使用scanner.nextInt()方法读取用户输入的5个整数,并将它们存储在userInputs数组中。

  4. Arrays.sort(userInputs);:使用Arrays类的sort方法对userInputs数组进行排序。

  5. int target = scanner.nextInt();:读取用户希望查找的目标整数。

  6. int index = Arrays.binarySearch(userInputs, target);:使用Arrays类的binarySearch方法在已排序的userInputs数组中查找目标整数的索引。

  7. 接下来的代码应该检查binarySearch方法返回的索引,并打印出相应的查找结果。目前这部分代码尚未完成,我们可以添加如下:

if (index < 0) {System.out.println("元素 " + target + " 在数组中未找到。");
} else {System.out.println("元素 " + target + " 在数组中的位置是: " + index);
}

这样,程序就可以根据binarySearch方法返回的索引值来告知用户目标值是否存在于数组中,如果存在,还能告诉用户其在数组中的位置。

请注意,Arrays.binarySearch方法假设数组是预先排序的。如果数组未排序,使用binarySearch可能会得到错误的结果。此外,如果数组中有重复的元素,binarySearch返回的索引可能是数组中任意一个匹配元素的位置。

完整的代码示例,包括用户输入和查找结果的打印,如下:

import java.util.Scanner;
import java.util.Arrays;public class ArraySortAndSearchExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入5个整数,输入完毕后请按回车键:");int[] userInputs = new int[5];for (int i = 0; i < userInputs.length; i++) {userInputs[i] = scanner.nextInt();}scanner.nextLine(); // 消耗掉行尾的换行符Arrays.sort(userInputs); // 对输入的数字进行排序System.out.println("排序后的数组: " + Arrays.toString(userInputs));System.out.print("请输入您希望查找的数字:");int target = scanner.nextInt();int index = Arrays.binarySearch(userInputs, target);if (index < 0) {System.out.println("元素 " + target + " 在数组中未找到。");} else {System.out.println("元素 " + target + " 在数组中的位置是: " + index);}scanner.close();}
}

这段代码还添加了用户提示信息,提高了程序的友好性和可用性。

应用场景案例

在处理大量的数据时,排序和查找是常见的需求,例如在数据库索引、搜索引擎或数据分析中。

优缺点分析

使用Arrays.sort()Arrays.binarySearch()的优点

  • 简单易用。
  • 经过优化,性能较好。

缺点

  • Arrays.sort()可能不适用于所有类型的数据,需要自定义比较器。
  • Arrays.binarySearch()要求数组是预先排序的。

自定义排序和查找算法的优点

  • 更灵活,可以根据特定需求定制。

缺点

  • 实现复杂度较高。
  • 性能可能不如标准库方法。

核心类方法介绍

Arrays.sort():对数组进行排序。
Arrays.binarySearch():在已排序的数组中进行二分查找。

测试用例

以下是使用main函数的一个测试用例,演示了数组的排序和查找。

测试代码

/*** @Author ms* @Date 2024-07-31 11:26*/
public class Test5 {public static void main(String[] args) {int[] numbers = {3, 1, 4, 1, 5};// 排序数组System.out.println("原始数组: " + Arrays.toString(numbers));Arrays.sort(numbers);System.out.println("排序后的数组: " + Arrays.toString(numbers));// 查找元素int target = 4;int index = Arrays.binarySearch(numbers, target);if (index < 0) {System.out.println("元素 " + target + " 未找到");} else {System.out.println("元素 " + target + " 的位置: " + index);}}
}

测试代码执行结果

  根据如上测试用例,我本地演示结果展示如下,仅供参考哈,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

代码分析

  针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码是一个完整的程序,它演示了如何使用Java标准库中的Arrays类对数组进行排序和查找操作。下面是对代码的逐行解释:

  1. package com.secf.service.action.hpy.hys.ListDir;:定义了程序的包名,通常反映了公司或组织的层级结构。

  2. import java.util.Arrays;:导入了Java的Arrays类,它提供了一系列操作数组的静态方法。

  3. 以多行注释形式提供了作者信息和日期。

  4. public class Test5:定义了一个名为Test5的公共类。

  5. public static void main(String[] args):这是程序的入口点,main方法,它接受一个字符串数组args作为参数。

  6. int[] numbers = {3, 1, 4, 1, 5};:声明并初始化了一个整型数组numbers

7-9. 打印原始数组,并使用Arrays.sort()方法对数组进行排序,然后打印排序后的数组。

10-15. 定义了要查找的目标值target,使用Arrays.binarySearch()方法在排序后的数组中查找该元素。根据返回的索引值判断元素是否存在于数组中,并打印相应的消息。

当这段代码执行时,它将首先打印出原始数组,然后是排序后的数组,接着会尝试查找数字4在数组中的位置,并打印出查找结果。输出结果将类似于:

原始数组: [3, 1, 4, 1, 5]
排序后的数组: [1, 1, 3, 4, 5]
元素 4 的位置: 3

请注意,数组索引从0开始,所以如果元素4在数组中的位置是3,这意味着它是数组中的第四个元素。

这段代码展示了Java中数组排序和查找的基本操作,这些操作在处理数据集合时非常有用。Arrays.sort()方法对数组进行原地排序,而Arrays.binarySearch()方法则利用已排序数组的特点,通过二分查找算法高效地定位元素。如果数组未排序或元素不存在于数组中,binarySearch将返回一个负数,表示元素应该插入的位置以维持排序。在本例中,由于数组已经排序,binarySearch能够直接返回元素4的正确索引。

小结

本文介绍了Java中数组排序和查找的基本方法。使用Java标准库中的Arrays类可以方便地进行这些操作,同时也可以根据需要实现自定义的算法。

总结

数组的排序和查找是数据处理中的基础操作。Java提供了强大的工具来简化这些任务,使得开发者可以更专注于解决问题本身而不是实现细节。无论是使用内置方法还是自定义算法,选择合适的方法对于提高程序的效率和可读性至关重要。
… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

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

相关文章

1960-2020中国1km分辨率年均气温数据

数据简介 中国1km分辨率年均气温数据是在中国大陆2400多个站点的气温年统计结果的基础上&#xff0c;融合了NOAA Gsod中包括港澳台在内亚洲地区1300个站点的数据&#xff0c;使用Ansuplin插值软件生成的1960-2020年0.01&#xff08;约1km&#xff09;的网格数据。 Ansuplin基…

shell外壳与Linux权限

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…

vue3前端开发-小兔鲜项目-添加购物车操作第一步

首先&#xff0c;呢&#xff0c;告诉大家一个坏消息&#xff0c;官方媒体的案例代码已经被他们删除了。如图所示。 也就是说&#xff0c;大家已经看不到官方的代码文件了。 那么既然如此&#xff0c;我们自己写的这个博客记录日志&#xff0c;就显得尤为重要了。继续今天的内容…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)

制作仪表板 引入数据模型 仪表板所需模型已经在数据模块中准备好&#xff0c;可以将对应模型表添加到数据模型中。提供了两种添加方式&#xff1a; 在数据栏中点击添加按钮&#xff0c;在弹出框中通过搜索或直接在其所在目录下选中该模型&#xff0c;点击确定。 点击数据按钮…

一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现

目录 前言&#xff1a; 一、密码加密 1. MD5介绍 2.彩虹表攻击 3.测试复杂密码是否能被攻破 二、加盐算法 1.对密码123456演示加盐算法 2.盐值的储存 3.密码加盐思想总结 三、Java代码实现 前言&#xff1a; 早些年&#xff0c;数据泄露屡见不鲜&#xff0c;每个班上总…

【Web前端】vue3整合eslint约束代码格式

一、整合eslint 整合eslint的两种方式&#xff1a; 在已有项目中整合eslint&#xff1a;# 安装eslint及其vue插件即可 npm i -D eslint eslint-plugin-vue创建项目时整合eslint&#xff1a; 提示 是否引入ESLint用于代码质量检测 时选择 是# 创建vue3项目 npx create-vue # 下…

.NET8使用VS2022打包Docker镜像

NET8使用VS2022打包Docker镜像 1. 项目中添加Docker支持文件2. 自定义镜像名称3. 发布Docker镜像3.1 安装Docker3.2 控制台切换到项目根目录,执行以下命令发布镜像 3.3 修改镜像名称4. 保存镜像到本地 1. 项目中添加Docker支持文件 2. 自定义镜像名称 项目文件PropertyGroup节…

vue3中 ref 和 reactive 的区别

相同&#xff1a;均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同&#xff1a;ref用于包装JavaScript基本类型的数据&#xff08;如字符串、数字、布尔值等&#xff09;&#xff0c;而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…

力扣45:跳跃游戏2题解

题目链接&#xff1a; https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解&#xff1a; 题目 难度 中等&#xff0c;标的是中等难度&#xff0c;而且我之前做过这道题&#xff0c;但是我没写…

AI大模型赋能开发者|海云安创始人谢朝海受邀在ISC.AI 2024大会就“大模型在软件开发安全领域的应用”主题发表演讲

近日&#xff0c;ISC.AI 2024 第十二届互联网安全大会在北京国家会议中心盛大开幕。作为全球规格最高、规模最大、影响力最深远的安全峰会之一&#xff0c;本次大会以“打造安全大模型 引领安全行业革命”为主题&#xff0c;聚焦安全与AI两大领域&#xff0c;吸引了众多行业领袖…

【NLP】文本张量表示方法【word2vec、词嵌入】

文章目录 1、文本张量表示2、one-hot词向量表示2.1、one-hot编码代码实现&#xff1a;2.2、onehot编码器的使用2.3、one-hot编码的优劣势 3、word2vec模型3.1、模型介绍3.2、CBOW模式3.3、skipgram模式3.4、word2vec的训练和使用3.4.1、获取训练数据3.4.2、训练词向量3.4.3、查…

学习笔记第二十三天

1.程序与进程 程序&#xff08;Program&#xff09;&#xff1a;是静态的&#xff0c;它是一组指令的集合&#xff0c;这些指令被存储硬盘上&#xff0c;&#xff0c;程序本身 不占用CPU或内存资源&#xff0c;直到它被加载到内存中执行。 程序---静态---硬盘 进程&#xff08…

C++速学day4

类的继承关系 蛇 和 爬行类动物 //这两个类就是继承关系 子类 父类 //它们的关系相当于 派生类 基类 继承的作用 1、 吸收基类成员 2、改造基类成员 3、添加新的成员 class Dervid…

docker基本管理和应用

docker是一个开源的应用容器引擎&#xff0c;基于go语言开发的 docker是运行在linux的容器化工具&#xff0c;可以理解为轻量级的虚拟机 可以在任何主机上&#xff0c;轻松创建的一个轻量级&#xff0c;可移植的&#xff0c;自给自足的容器 鲸鱼--------->宿主机 集装箱…

vulnstack-7(红日靶场七)

环境配置 vlunstack是红日安全团队出品的一个实战环境&#xff0c;具体介绍请访问&#xff1a;漏洞详情http://vulnstack.qiyuanxuetang.net/vuln/detail/9/ 添加两个网卡 DMZ区域&#xff1a; 给Ubuntu (Web 1) 配置了两个网卡&#xff0c;一个可以对外提供服务&#xff1b;…

前端路由VueRouter总结

简介&#xff1a; Vue路由vue-router是官方的路由插件&#xff0c;能够轻松的管理 SPA 项目中组件的切换。Vue的单页面应用是基于路由和组件的&#xff0c;路由用于设定访问路径&#xff0c;并将路径和组件映射起来vue-router 目前有 3.x 的版本和 4.x 的版本&#xff0c;vue-…

设计模式(1)创建型模式和结构型模式

1、目标 本文的主要目标是学习创建型模式和结构型模式&#xff0c;并分别代码实现每种设计模式 2、创建型模式 2.1 单例模式&#xff08;singleton&#xff09; 单例模式是创建一个对象保证只有这个类的唯一实例&#xff0c;单例模式分为饿汉式和懒汉式&#xff0c;饿汉式是…

sliver源码分析-初始化以及脚手架

引言 项目概述&#xff1a;对开源的C2框架sliver进行源码分析&#xff0c;意图学习其原理。本篇分析sliver的入口以及脚手架&#xff0c;和基本的配置文件目标与读者&#xff1a;网络安全兴趣爱好者 准备工作 源码路径BishopFox/sliver: Adversary Emulation Framework (git…

[C++][opencv]基于opencv实现photoshop算法图像旋转

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像旋转: src为原图像&#xff0c; dst为新图像, angle为旋转角度, isClip表示是采取缩小图片的方式 int imageRotate4(InputArray src, OutputArray dst, double angle, bool isClip) {Mat input src.…

【c++】类和对象 (中) (类的默认成员函数)

类的默认成员函数 在C中&#xff0c;如果你定义了一个类但没有显式地提供特定的成员函数&#xff08;比如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等&#xff09;&#xff0c;编译器会为这些函数生成默认的实现。这些默认生成的成员函数称为类的默认成员函数。那么既…