Java使用Comparable<Integer>数组实现归并排序merge方法的比较问题
问题修正说明
你的代码存在三个核心问题:
- 直接用
<比较Comparable<Integer>类型不生效:</>这类数值比较运算符仅支持基本数据类型(int/long/double等),Comparable是接口类型,属于引用类型,无法直接用运算符比较。 - 之前写
list[i].compareTo(list2[j])报错有两个原因:一是Comparable<Integer>的compareTo方法要求传入的参数类型为Integer,但你传入的list2[j]编译类型是Comparable<Integer>,类型不匹配;二是compareTo返回值是int类型,Java中int不能直接作为if的判断条件(没有非0即真的规则),必须判断返回值和0的大小关系才能确定大小。 - 结果数组
C仅做了声明没有初始化:Java中数组必须指定长度、完成内存分配后才能赋值,否则运行时会抛出空指针异常。
修正后可运行代码
public static Comparable<Integer>[] merge(Comparable<Integer> list[], Comparable<Integer> list2[] ) { int totalLen = list.length + list2.length; // 初始化结果数组,泛型数组创建需要做类型强转绕过编译检查 Comparable<Integer> C[] = (Comparable<Integer>[]) new Comparable[totalLen]; int i = 0, j = 0, k = 0; while (i < list.length && j < list2.length) { // compareTo返回值规则:小于0代表调用方 < 参数,等于0代表相等,大于0代表调用方 > 参数 // 实际存储的元素都是Integer类型,强转是安全的 if (list[i].compareTo((Integer) list2[j]) < 0) { C[k] = list[i]; i++; } else { C[k] = list2[j]; j++; } k++; } // 拷贝左段剩余元素 while (i < list.length) { C[k++] = list[i++]; } // 拷贝右段剩余元素 while (j < list2.length) { C[k++] = list2[j++]; } return C; }
补充说明
调用这个merge方法时,传入的数组元素必须是Integer类型(Integer本身实现了Comparable<Integer>接口),要保证两个数组的元素实际类型一致,否则强转时会抛出类型转换异常。
内容的提问来源于stack exchange,提问作者Nuh
相关产品推荐
相关产品推荐

