如何修复Java二分查找中运算符'>'无法应用于String类型的编译错误
编译报错的核心原因
Java语法中,>、<这类关系运算符仅支持基本数值类型(int、double等)的比较,无法直接作用于String类型对象。你代码里写的arr[mid].Surname > key本意是比较两个姓氏的字典序,以此划定二分查找的搜索区间,但这种写法不符合Java的语法规则,因此直接触发编译报错。
同时你的代码中还存在两处隐蔽的逻辑隐患,即便修复了编译错误,也会导致运行结果异常:
- 用
==判断两个字符串是否相等:==对比的是字符串对象的内存地址,而非字符串本身的内容,绝大多数场景下会得到错误的判断结果 - 递归实现的二分查找缺少终止边界:当搜索区间缩小到
left > right时,数组下标会越界,触发运行时空指针/越界异常
具体修复步骤
- 替换字符串大小比较逻辑:使用String类内置的
compareTo()方法完成字典序对比。该方法的返回规则为:调用方法的字符串字典序早于参数时返回负整数,内容完全一致时返回0,字典序晚于参数时返回正整数。你原代码中判断“当前姓氏大于查找key”的逻辑,等价于arr[mid].Surname.compareTo(key) > 0,保持原有的二分区间收缩规则即可。 - 替换字符串相等判断逻辑:将所有用
==对比字符串内容的代码,换成equals()方法。判断Academic_debt是否等于"4"时,将常量"4"写在方法调用前,可避免该字段为null时触发空指针异常。 - 补充递归终止边界:在Search方法的最开头增加判断,当搜索区间的左边界大于右边界时,直接返回null,结束递归。
修复后的完整代码
public class Binary { static public Student Search(Student[] arr, String key, int left, int right){ // 递归终止边界:区间无有效搜索内容时直接返回 if (left > right) { return null; } int mid = left + (right - left)/2; // 用equals完成字符串内容相等判断 if(arr[mid].Surname.equals(key)){ // 常量在前的equals调用,规避空指针风险 if("4".equals(arr[mid].Academic_debt)) { Student temp = arr[mid]; arr[mid] = null; return temp; } return null; } // 用compareTo的返回值替代大于号比较 else if(arr[mid].Surname.compareTo(key) > 0){ return Search(arr,key ,left, (mid - 1)); } else{ return Search(arr,key ,(mid + 1), right); } } static public void Show(Student[] arr){ int k = 0; for(int i = 0; i < arr.length; i++) { if(arr[i] != null) { System.out.println( ++k + ": " + arr[i].toString()); } } } }
注意:二分查找的生效前提是传入的Student数组必须提前按Surname字段的字典序升序排列,否则
compareTo的比较方向和二分收缩逻辑不匹配,会出现查找失败的问题。
内容的提问来源于stack exchange,提问作者RavenBone228
相关产品推荐
相关产品推荐

