继承接口的泛型的数组该如何创建?

来源:1-1 最简单的排序算法:选择排序法

武当王也

2022-01-12 20:09:23

// 这就是选择排序法的第一种方式,从数组中依次挑出最小的,需要注意的是,被拿出来的不能继续后续的挑选。
public static <E extends Comparable<E>> void sort1(E[] data) {
    E[] empty = (E[])new Object[data.length];
    // java 不支持泛型问题描述:数组,通过Object来进行强制类型转化来实现
    for(int i = 0; i < data.length; i ++) {
        // [0, i)是排序的,[i, n)是未排序的
        int minIndex = i;
        for(int j = 0; j < data.length; j ++) {
            // 处理特殊情况,就是当前i所在的那个位置为null了
            if(data[j] == null)
                continue;
            if(data[minIndex] == null) {
                minIndex = j;
            }
            if(data[j].compareTo(data[minIndex]) < 0) {
                minIndex = j;
            }
        }
        // 找到最小的了,将他放入新数组中,他原本所在的位置置为空
        empty[i] = data[minIndex];
        data[minIndex] = null;
    }
}

上面的这段代码,是我按照每次从数据中获取最小的元素放到一个全新的数组中去,需要用到一个额外的数组空间,但是这段代码

 E[] empty = (E[])new Object[data.length];

有点问题无法像后面章节那样进行强转,因为E 实现了Comparable接口导致的。

目前,我通过传参的形式来实现,即sort1(E[] data, E[] empty)。

请问老师,如果我想要设计sort1(E[] data) 如何实现那个额外空间的数组的创建呢?


上述代码编译不报错,运行报错

https://img.mukewang.com/climg/61dec74b099525db09500188.jpg

写回答

1回答

liuyubobobo

2022-01-13

因为在的逻辑中,empty 的元素并没有使用 Comparable 的特性,所以直接开 Object 的数组就可以:

Object[] empty = new Object[data.length];



如果你需要使用 Comparable 的特性,可以开 Comparable 的数组:

Comparable[] empty = new Comparable[data.length];



如果你的泛型 E 有更多的约束,可以使用反射中的 Array:

E[] empty = (E[])Array.newInstance(data.getClass().getComponentType(), data.length);

(需要加载  import java.lang.reflect.Array;)


反射是一个大话题,也不在这个课程的范围里,如果你感兴趣,可以寻找更多资料自学。



但其实,如果你的需求特别复杂,就应该考虑使用一个新的类去承载(而非单纯的静态数组),比如用 ArrayList。



继续加油!:)

0

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2584 学习 · 1062 问题

查看课程