3.用泛型编写排序方法(适用于所有实现Comparable的类)

1.本节重点

泛型范围约束,如本节标题所述,要编写一个泛型排序方法,是必须要有一定的约束条件的,而泛型提供的范围约束修饰符是实现稳定的泛型排序方法的关键。

如果我们希望声明的泛型只能是某些接口或类的子类,我们可以这样做: <T extends Comparable<T>> 
如果我们希望声明的泛型只能是某些接口或类的父类,我们可以这样做: <T super Comparable<T>>

其中Comparable就是我们说的某些类或接口,如果我们尝试传入不符合上面声明条件的类型进去的话,会在编译器就报错。

2.实例学习

我们尝试编写一个限制类型的泛型排序方法和获取最大值最小值的方法。

2.1 实现代码

代码如下:

public class GenericComparison {
    /**
     * 获得泛型数组array中最小的元素(元素必须实现了Compareable接口)
     * @param array 泛型数组
     * @param <T> 类型变量
     * @return 元素
     */
    public static <T extends Comparable<T>> T getMin(T[] array) {
        if (array == null || array.length == 0) {
            return null;
        }
        T min = array[0];
        
        for (int i = 1; i < array.length; i++) {
            if (min.compareTo(array[i]) > 0) {
                min = array[i];
            }
        }
        return min;
    }

    public <T extends Comparable> T getMax(T[] array) {
        if (array == null || array.length == 0) {
            return null;
        }
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }

    /**
     * 泛型排序方法:采用冒泡排序
     * @param array
     * @param <T>
     * @return
     */
    public static <T extends Comparable> T[] sorted(T[] array){
        if (array == null || array.length == 0) {
            return null;
        }
        for (int i = 0; i < array.length; i++) {
            for(int j=0;j<array.length;j++){
                if(array[i].compareTo(array[j])<0){
                    T temp=array[i];
                    array[i]=array[j];
                    array[j]=temp;
                }
            }
        }
        return array;
    }
}

2.2 测试反例

public class GenericComparisonTest {
    public static void main(String[] args) {
        Object[] objects = new Object[10];
        Object test = GenericComparison.getMin(objects);
    }
}

在这里插入图片描述

2.3 测试正例

package GenericStudy.Exa135;

public class GenericComparisonTest {
    public static void main(String[] args) {
        String[] books = { "Java从入门到精通(第2版)", "Java编程宝典", "细说Java", "视频学Java" };
        Integer[] nums={5,4,6,8,6};
        System.out.println("麻子新书列表:");
        for (String book : books) {
            System.out.println(book);
        }
        String min = GenericComparison.getMin(books);
        System.out.println("按名称排序的第一本书:");
        System.out.println(min);
        String[] result=GenericComparison.sorted(books);
        System.out.println("排序后:");
        for(String a:result){
            System.out.println(a);
        }
        Integer[] numResult=GenericComparison.sorted(nums);
        for(Integer a:numResult){
            System.out.println(a);
        }
    }
}

运行之:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小牧之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值