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

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

  我是一名后端开发爱好者,工作日常接触到最多的就是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;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

应用场景案例

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

优缺点分析

  • 线性搜索
    • 优点:实现简单,无需考虑数据是否有序。
    • 缺点:在最坏情况下可能需要检查每个元素,效率较低。
  • 二分搜索
    • 优点:在有序集合中搜索效率高,时间复杂度为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));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

代码解析:

这段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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.

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

  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 !!!


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

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

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