Java零基础-集合:集合的搜索算法

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

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

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

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

Java零基础-集合的搜索算法

前言

在Java编程中,对集合进行搜索是一项常见的任务。集合的搜索算法可以快速定位或检索集合中的元素。对于Java零基础的学习者来说,了解和掌握集合搜索算法的基本概念和实现方式对于提高编程技能至关重要。

摘要

本文将介绍Java集合中的搜索算法,包括线性搜索和二分搜索两种基本方法。通过代码示例和测试用例,本文将帮助Java零基础的学习者理解如何在集合中进行有效搜索。

简介

Java集合框架提供了多种数据结构来存储集合元素,如ListSetMap。每种数据结构都有其特定的搜索方法。例如,List接口的实现可以通过索引进行快速搜索,而SetMap通常需要遍历来搜索特定元素。

源代码解析

以下是使用线性搜索和二分搜索算法的简单示例:

import java.util.ArrayList;
import java.util.List;

public class SearchAlgorithmExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);
        numbers.add(50);

        int searchValue = 30;

        // 线性搜索示例
        if (linearSearch(numbers, searchValue)) {
            System.out.println(searchValue + " found in the list.");
        } else {
            System.out.println(searchValue + " not found in the list.");
        }

        // 二分搜索示例
        if (binarySearch(numbers, searchValue) != -1) {
            System.out.println(searchValue + " found at index " + binarySearch(numbers, searchValue));
        } else {
            System.out.println(searchValue + " not found in the list.");
        }
    }

    // 线性搜索方法
    public static boolean linearSearch(List<Integer> list, int value) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == value) {
                return true;
            }
        }
        return false;
    }

    // 二分搜索方法
    public static int binarySearch(List<Integer> list, int value) {
        int left = 0;
        int right = list.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (list.get(mid) == value) {
                return mid;
            } else if (list.get(mid) < value) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
}

应用场景案例

  • 线性搜索:适用于无序集合或小型数据集。
  • 二分搜索:适用于有序集合,且数据集较大时效率更高。

优缺点分析

  • 线性搜索
    • 优点:实现简单,无需考虑数据是否有序。
    • 缺点:在最坏情况下可能需要检查每个元素,效率较低。
  • 二分搜索
    • 优点:在有序集合中搜索效率高,时间复杂度为O(log n)。
    • 缺点:要求数据有序,且实现相对复杂。

类代码方法介绍

以下是Java中进行集合搜索时常用的方法:

  • linearSearch(List<?> list, Object value): 线性搜索方法,遍历列表以查找值。
  • binarySearch(List<?> list, Object value): 二分搜索方法,对有序列表进行高效搜索。

测试用例

以下是使用main函数编写的测试用例示例:

public class SearchTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add(i * 10); // 创建有序列表
        }

        int searchValue = 50;

        // 测试线性搜索
        System.out.println("Linear search result: " + linearSearch(list, searchValue));

        // 测试二分搜索
        System.out.println("Binary search result: " + binarySearch(list, searchValue));
    }
}

代码解析:

这段Java代码演示了如何在一个有序的List集合中进行线性搜索和二分搜索。但是,代码中使用的linearSearchbinarySearch方法没有在代码示例中定义,我将为这两个方法提供实现,并解释整个程序的工作流程。

import java.util.ArrayList;
import java.util.List;

public class SearchTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        // 创建并填充有序列表
        for (int i = 1; i <= 10; i++) {
            list.add(i * 10);
        }

        int searchValue = 50;

        // 测试线性搜索
        boolean linearSearchResult = linearSearch(list, searchValue);
        System.out.println("Linear search result: " + linearSearchResult);

        // 测试二分搜索
        int binarySearchResult = binarySearch(list, searchValue);
        System.out.println("Binary search result: " + binarySearchResult);
    }

    // 线性搜索方法
    public static boolean linearSearch(List<Integer> list, int value) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == value) {
                return true;
            }
        }
        return false;
    }

    // 二分搜索方法
    public static int binarySearch(List<Integer> list, int value) {
        int left = 0;
        int right = list.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (list.get(mid) == value) {
                return mid; // 返回找到的位置
            } else if (list.get(mid) < value) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1; // 未找到返回-1
    }
}

以下是对代码中每个部分的解释:

  1. 导入ArrayListList类。
  2. 定义SearchTest类和main方法。
  3. 创建一个ArrayList并填充有序的整数(1到100的倍数)。
  4. 定义要搜索的值searchValue为50。
  5. 调用linearSearch方法进行线性搜索,打印搜索结果(如果找到返回true,否则返回false)。
  6. 调用binarySearch方法进行二分搜索,打印搜索结果(如果找到返回元素的索引,否则返回-1)。

请注意,binarySearch方法要求列表必须是有序的,否则可能无法正确工作。线性搜索则没有这个要求,但效率相对较低,特别是在列表很大的情况下。

当这段代码运行时,它将展示如何在有序列表中使用线性搜索和二分搜索算法来查找特定值。这是对搜索算法操作的基础演示,适合初学者理解搜索算法的基本用法。

全文小结

本文介绍了Java集合中的两种基本搜索算法:线性搜索和二分搜索。通过代码示例和测试用例,我们学习了在不同情况下如何选择和实现搜索算法。

总结

选择合适的搜索算法对于提高程序性能至关重要。线性搜索适用于无特定顺序的数据集合,而二分搜索则利用数据的有序性来提高搜索效率。希望本文能帮助Java零基础的学习者快速掌握集合搜索算法的使用。

… …

文末

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

… …

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

wished for you successed !!!


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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文弄懂线性回归模型

1、引言 今天&#xff0c;我们将深入探讨机器学习中的三个关键概念&#xff1a;线性回归、代价函数和梯度下降。这些概念构成了许多机器学习算法的基础。起初&#xff0c;我决定不写一篇关于这些主题的文章&#xff0c;因为它们已经被广泛涉及。不过&#xff0c;我改变了主意&…

小白快速入门canvas画海报

小编以微信小程序原生语言举例 wxml页面&#xff1a; <canvas type"2d" id"myCanvas" style"width:375px;height:667px;"></canvas> js页面&#xff1a; import drawQrcode from ../../../utils/qrcode/weapp.qrcode.esmdata: {…

IDEA SpringBoot整合SpringData JPA(保姆级教程,超详细!!!)

目录 1. 简介 2. 创建SpringBoot项目 3. Maven依赖引入 4. 修改application.properties配置文件 5. Entity实体类编写 6. Dao层接口开发 7. 测试接口开发 8. 程序测试 1. 简介 本博客将详细介绍在IDEA中&#xff0c;如何整合SpringBoot与SpringData JPA&#xff0c;以…

EtherCAT笔记(四)——EtherCAT数据帧结构

EtherCAT数据包含2B的数据头和44~1948B的数据区。数据区由多个子报文组成。由于EtherCAT本身是通过以太网数据帧的形式传输&#xff0c;因此其协议帧中会携带以太网的帧头。 其中&#xff0c;解释如下&#xff1a; &#xff08;1&#xff09;以太网数据帧头&#xff1a;EtherC…

AUTOSAR NvM模块(一)

NvMBlockDescriptor [ECUC_NVM_00061] 用于存储所有特定于块的配置参数的容器。对于每个非易失性随机存取存储器&#xff08;NVRAM&#xff09;块&#xff0c;应该指定这个容器的一个实例。 NvMBlockCrcType 定义了NVRAM块的CRC数据宽度。根据Autosar标准&#xff0c;此参数…

KVB外汇:澳元/美元、澳元/纽元、英镑/澳元的走势如何?

摘要 本文对近期澳元/美元、澳元/纽元、英镑/澳元的技术走势进行了详细分析。通过对关键支撑位和阻力位的分析&#xff0c;我们可以更好地理解澳元在不同货币对中的表现。随着全球经济形势的变化&#xff0c;各国央行的货币政策对外汇市场的影响也愈发明显。本文旨在帮助投资者…

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要&#xff1a;解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题&#xff0c;对若⼲证券⾏业的实际流量内容进⾏调研分析&#xff0c; 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁&#xff0c;并提出防…

用GAN生成奖杯

数据集链接&#xff1a;https://pan.baidu.com/s/19Uxc2ELiMG3acUtLeSTDTA?pwdwsyw 提取码&#xff1a;wsyw 我设置的图片大小为128*128&#xff0c;如果内存爆炸可以将batch_size调小&#xff0c;epoch我设置的2000&#xff0c;我感觉其实1000也够了。代码如下&#xff1a; …

信创认证 | Smartbi Insight V11成功适配申威3231处理器

在信息技术飞速发展的浪潮中&#xff0c;软硬件的深度融合与协同发展已成为推动行业创新的关键因素。 近日&#xff0c;思迈特商业智能与数据分析软件[简称&#xff1a;Smartbi Insight]V11在统信服务器操作系统V20和中电科申泰信息科技有限公司产品申威3231处理器环境下完成适…

CAN和CANFD数据写入.asc文件的dll

因为工作需要&#xff0c;需要做一些硬件不是CANoe的上位机&#xff08;比如说周立功CAN,NI-CAN&#xff09;&#xff0c;上位机需要有记录数据的功能&#xff0c;所以用Qt制作了一个记录数据的dll&#xff0c;方便重复使用&#xff08;因为有的客户指定了编程软件&#xff0c;…

51循迹小车(蓝牙+循迹+超声波+舵机+避障L298N)

基本驱动 L298N电机驱动模块负责供电和控制电机驱动 将电池12V供电接到12V供电上&#xff0c;作为输入。单片机及其他器件供电可以使用5V供电&#xff0c;这里的GND都接到一起。 输出A和输出B接到电机上&#xff0c;负责给电机供电和控制电机。 通道A使能和通道B使能以及逻…

【Windows下使用vckpg下载protoc之后环境变量问题】

使用vcpkg进行下载的protoc&#xff1a; vcpkg install protobuf protobuf:x64-windows 检查protoc版本时出现问题&#xff1a; “protoc”不是内部或外部命令&#xff0c;也不是可运行程序或批处理文件 尝试添加系统环境变量后没有反应。 这个时候找到vckpg下的packages目录…

如何利用ChatGPT寻找科研创新点?分享5个有效实践技巧

欢迎关注&#xff1a;智写AI&#xff0c;为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥交流&#xff1a;yida985 地表功能最强大的高级学术专业版已经开放&#xff0c;拥有全球领先的GPT学术科研应用&#xff0c;有兴趣…

鸿蒙开发设备管理:【@ohos.brightness (屏幕亮度)】

屏幕亮度 该模块提供屏幕亮度的设置接口。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import brightness from ohos.brightness;brightness.setValue setValue(value: number):…

【Linux】网络编程套接字

一、预备知识 1.1 理解源IP地址和目的IP地址 在IP数据报的头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 源IP地址和目的IP地址是网络通信中常用的两个概念&#xff0c;他们代表了通信中的两个节点。 源IP地址是指发起通信的节点的IP地址&#…

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…

FastAPI教程I

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…

从我邮毕业啦!!!

引言 时间过的好快&#xff0c;转眼间就要从北邮毕业了&#xff0c;距离上一次月度总结又过去了两个月&#xff0c;故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 毕业&#x1f393; 6月1号完成了自己的…

Windows server 2016.2019 .NET Framework 3.5安装包、安装步骤

windows server2019 操作系统 安装 sqlserver2008时提示缺少 .NET Frameword 3.5&#xff0c; 在功能里选择 .NET Frameword 3.5安装报错&#xff0c; 下载安装包&#xff0c;下载地址 https://download.csdn.net/download/qq445829096/89450429这里指定备份源路径 安装包解…