怎么在初级项目开发中利用面向对象思想编写一个标准的二分查找法

大涛君_7881

大涛君_7881

2026-06-28

215人浏览

原创

面向对象写二分查找的核心是将数据容器、搜索区间和查找行为拆分为职责清晰的对象。SearchRange封装区间操作,BinarySearcher协调流程,SortedArraySearch在Python中自动排序并提供语义清晰的find方法,提升可读性、复用性与可测试性。

怎么在初级项目开发中利用面向对象思想编写一个标准的二分查找法

面向对象写二分查找,核心不是把逻辑“套个类壳”,而是把搜索过程中的关键角色——数据容器、搜索区间、查找行为——拆成职责清晰的对象。它让代码更易理解、可复用、好测试,尤其适合初级项目中需要反复调用或后续扩展的场景。

先明确三个核心角色

标准二分查找背后其实有三个稳定实体:

  • 有序数据源:比如一个已排序的 int[] 或 List,它只负责提供元素,不参与逻辑判断
  • 搜索区间:封装 left、right、mid 的计算与更新,隐藏下标细节,对外只暴露“当前是否还有范围”“中间值是什么”“如何丢弃左/右半区”
  • 查找器(主逻辑):协调前两者,做比较、决定缩哪边、返回结果,不直接操作数组下标

用 Java 写一个干净可复用的版本

下面是一个贴近初级开发习惯的实现,不依赖高级集合,也不做过度抽象:

先定义区间类(职责单一,便于调试):

class SearchRange {
    private final int[] data;
    private int left;
    private int right;
<pre class="brush:php;toolbar:false;">SearchRange(int[] data) {
    this.data = data;
    this.left = 0;
    this.right = data.length - 1;
}

boolean hasElement() {
    return left <p>}</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/ai/2541" title="Komo Search"><img
														src="https://img.php.cn/upload/ai_manual/001/246/273/6971f4a02116e254.png" alt="Komo Search" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/ai/2541" title="Komo Search" class="overflowclass">Komo Search</a>
													<p class="overflowclass">一款AI工具,主要用于Komo Search 是一个生成式AI驱动的搜索引擎,适合需要提升相关任务效率的用户。</p>
												</div>
												<a rel="nofollow" href="/ai/2541" title="Komo Search" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>

再写查找器(专注流程,不碰原始数组):

class BinarySearcher {
    public static int search(int[] arr, int target) {
        if (arr == null || arr.length == 0) return -1;
<pre class="brush:php;toolbar:false;">    SearchRange range = new SearchRange(arr);
    while (range.hasElement()) {
        if (range.midValue() == target) {
            return range.midIndex();
        } else if (range.midValue() <p>}</p>

调用时就很简单:

int[] nums = {2, 5, 8, 13, 21};
int idx = BinarySearcher.search(nums, 13); // 返回 3

Python 中更轻量的面向对象写法

Python 不强制封装,但可以用类把“准备+查找”流程组织起来,避免重复写排序和边界检查:

class SortedArraySearch:
    def __init__(self, data):
        # 确保输入有序,否则主动排序(仅在初始化时做一次)
        self.data = sorted(data) if data else []
<pre class="brush:php;toolbar:false;">def find(self, target):
    if not self.data:
        return -1
    left, right = 0, len(self.data) - 1
    while left <h1>使用示例</h1><p>searcher = SortedArraySearch([5, 1, 9, 3])
print(searcher.find(9))  # 输出 3(自动排好序后查找)</p>

这种写法对初学者友好:类名直白、构造时处理脏数据、方法语义清晰,不需要理解“区间对象”也能上手。

为什么这样写更适合初级项目

面向对象不是炫技,是为降低认知负担:

  • 不用每次调用都手动初始化 left/right/mid,类帮你记着
  • 排序逻辑只出现在构造函数里,后续所有 find() 都基于有序前提,不会漏掉
  • 测试时可以单独 mock SearchRange 或替换 SortedArraySearch.data,方便单元验证
  • 如果将来要支持降序、支持泛型、加日志或计数,只需改对应类,不影响调用方

只要数组有序、循环条件用 left

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9777

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6922

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6112

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1296

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2569

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19891

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 3.3万人学习

PHP面向对象编程-OOP技术
PHP面向对象编程-OOP技术

共44课时 | 6.8万人学习