Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 398|回复: 0

[泛型学习]用Java泛型实现数组排序和搜索的通用方法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-29 23:56:29 | 显示全部楼层 |阅读模式
    下面讨论的是数组的排序和搜索功能,而一个通用方法则是实现Comparable接口的方法,这个方法需要通过java泛型来实现。
    下面便逐步讲解为何,以及如何通过Java泛型实现此类的通用方法。
        如何在java类中实现一些通用方法, 特别是一些静态的工具方法?  
        比如,数组Arrays的sort、search等?  
        1. 整数数组的顺序搜索  
       
    1. [/code]
    2.    
    3.      [b]public[/b] [b]static[/b] [b]int[/b] seqSearch([b]int[/b][] arr, [b]int[/b] first, [b]int[/b] last, [b]int[/b] target) {   
    4.          [b]for[/b] ([b]int[/b] i = first; i < last; i++)   
    5.              [b]if[/b] (arr[i] == target)   
    6.                  [b]return[/b] i;   
    7.          
    8.          [b]return[/b] -1;   
    9.      }   
    10.       
    11.       
    12.     1.1对上面的方法进行抽象,最先让我们想到就是,使用java的Object的引用,来实现通用方法  
    13.     [code]
    复制代码
       
         public static int seqSearch(Object[] arr, int first, int last, Object target) {   
             for (int i = first; i < last; i++)   
                 if (arr.equals(target))   
                     return i;   
             
             return -1;   
         }   
          
          
        2.1这样看来好像Object的引用好像非常方便,而且第二个顺序搜索可以使用到float,double,String等等。
    如果我们要进一步研究就会出现问题  
       
    1. [/code]
    2.    
    3.      [b]public[/b] [b]static[/b] [b]void[/b] selectionSort([b]int[/b][] arr) {   
    4.          [b]int[/b] n = arr.length, smallIndex = 0;   
    5.          [b]for[/b] ([b]int[/b] i = 0; i < n; i++) { // 遍历array数组   
    6.              smallIndex = i;   
    7.              [b]for[/b] ([b]int[/b] j = i + 1; j < n; j++)   
    8.                  [b]if[/b] (arr[smallIndex] > arr[j]) // 选择最小的索引j   
    9.                      smallIndex = j;   
    10.              // if (smallIndex != i) {   
    11.              exchange(arr, i, smallIndex);// 交换  
    12.              // }   
    13.          }   
    14.      }   
    15.       
    16.       
    17.     2.2上面的代码是一个顺序排序的算法,若果我们要写一个通用方法,就必须把object类型强制装换为一个
    18. 实现Comparable接口的方法。
    19.     JVM在处理类型强制装换的时候就会,抛出一个警告:uncheck cast
    20.     [code]
    复制代码
       
         @SuppressWarnings("unchecked")   
         public static void selectionSort(Object[] arr) {   
             
             int n = arr.length, smallIndex = 0;   
             for (int i = 0; i < n; i++) { // 遍历array数组   
                 smallIndex = i;   
                 for (int j = i + 1; j < n; j++)    // 选择最小的索引j
                if (((Comparable< Object>)arr[smallIndex]).compareTo(((Comparable< Object>)arr[j])) > 0)     
                         smallIndex = j;   
                 // if (smallIndex != i) {   
                 exchange(arr, i, smallIndex);// 交换  
                 // }   
             }   
         }   
          
          
        有此可以看出使用Object引用来处理通用问题,当使用实参如果没有实现Comparable接口,编译器会抛出一个castClassException的运行时异常。这样的程序是不安全的。  
        3.1使用Object引用来泛化一个算法(如顺序搜索)。通过使用数组的Object引用和目标值,
    只要数据类型实现了equals方法,算法中要比较大小的数据类必须实现Comparable接口,
    现在我们来用java泛型来解决这个问题
      
        [code][/code]
       
         public static < T extends Comparable<? super T>> void selectionSort(T[] arr){   
             int n = arr.length;   
             int smallIndex;   
             for (int i = 0; i < n-1; i++) {   
                 smallIndex=i;   
                 for (int j = i+1; j < n; j++)     
                     if (arr[j].compareTo(arr[smallIndex])<0)     
                         smallIndex=j;   
                 exchange(arr, smallIndex, i);   
             }   
         }   
          
          
        在Arrays类中的静态方法 selectionSort(),这个方法处理的是整数类型。要用泛型版本来实现这个算法, 由于要泛型类型数组T[]中的两个元素要进行比较,所以传递实参的对象类型或其超类必须实现Comparable接口。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 01:07 , Processed in 0.384484 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表