Java初识泛型 | 如何通过泛型类/泛型方法实现求数组元素最大值?

news/2024/10/22 15:37:02/

目录

一、引言

二、编程分析

1、泛型类实现

思路

代码

2、泛型方法实现

思路

代码 

三、拓展:数组排序(以冒泡排序为例)

1、int类型 原代码

2、泛型类

3、泛型方法


一、引言

给定一个整型数组,求数组中所有元素的最大值

该题同样是编程入门的基础题。关键在于拓展:能不能通过程序,实现给定的任意类型的数组,都能求出数组中所有元素的最大值?

这里我们先给出整型数组求最大值的代码,作为基础:

public class Util {public int findMaxInt(int[] array) {int max = array[0];for (int i = 0; i < array.length; i++) {if(max < array[i]) {max = array[i];}}return max;}
}

 调用并运行:

public class Test {public static void main(String[] args) {int[] array = {1,0,9,4,5};System.out.println("max is " + util.findMaxInt(array));}
}

 接下来我们来分析,如果通过泛型类或泛型方法使程序能够适用于任意一个数据类型。


二、编程分析

1、泛型类实现

解题之前,我们首先要了解泛型、泛型上界、泛型方法的概念。对于这些概念有所遗忘的同学,可以阅读文章:🔗Java初识泛型 | 如何通过泛型类/泛型方法获取任意类型的三个数的最大值?的知识解析部分熟悉一下。

这里,我们直接讲解思路,不再进行基础知识的铺垫。

思路

按照泛型的思路,我们试着将原来的类改成泛型类。用占位符E代替原代码中所有的int。但仅仅更改这些,最后会发现编译器在比较的位置报错了:

是什么原因导致编译失败呢? 

原因:max和array[i]都是E类型也就是引用类型的变量,两个引用变量之间不能用大于小于号进行大小比较。可行的方法应当是调用比较对象的compareTo()方法。但是,compareTo()方法是不能直接调用的,它要求调用的对象的类型必须实现过Comparable接口。

如图 尝试直接调用compareTo()方法失败

换句话说,它对类型E有约束,这个约束就是: 必须实现过Comparable接口。因此,这里要用到类型的上界的知识,来进行约束。

public class Util<E extends Comparable<E>> {...
}

<E extends Comparable<E>> 的含义为:传入的E类型必须是实现了Comparable接口的。如果传入的类型没有实现过Comparable接口,那么编译会报错。

此时,我们可以成功地调用compareTo()方法了:

此时调用成功

 整合后,便能得出完整的代码了。

代码

泛型类: 

public class Util<E extends Comparable<E>> {public E findMax(E[] array) {E max = array[0];for (int i = 0; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}

调用:

Integer

public class Test {public static void main(String[] args) {Util<Integer> util = new Util<>();Integer[] array = {1,0,9,4,5};System.out.println("max is " + util.findMax(array));}
}

Double(只需更改main中的数据类型即可,Util类不用变动)

public class Test {public static void main(String[] args) {Util<Double> util = new Util<>();Double[] array = {13.6,100.5,0.0,-3.1,5.8};System.out.println("max is " + util.findMax(array));}
}

String 

public class Test {public static void main(String[] args) {Util<String> util = new Util<>();String[] array = {"China","America","Australia","Ireland"};System.out.println("max is " + util.findMax(array));}
}

自定义的类型Tmp,已手动实现了Comparable<Tmp>接口

//Tmp.javapublic class Tmp implements Comparable<Tmp>{public int parameter1;public String parameter2;public Tmp(int parameter1, String parameter2) {this.parameter1 = parameter1;this.parameter2 = parameter2;}@Overridepublic int compareTo(Tmp o) {//以parameter2为标准来比较Tmp//parameter2是String类,比较可以直接调用String类的compareTo方法return this.parameter2.compareTo(o.parameter2);}@Overridepublic String toString() {return "Tmp{" +"parameter1=" + parameter1 +", parameter2='" + parameter2 + '\'' +'}';}
}
//Test.javapublic class Test {public static void main(String[] args) {Util<Tmp> util = new Util<>();Tmp tmp1 = new Tmp(10,"substantial");Tmp tmp2 = new Tmp(20,"circumspect");Tmp tmp3 = new Tmp(5,"coby");Tmp[] array = {tmp1,tmp2,tmp3};System.out.println("max is " + util.findMax(array));}
}


2、泛型方法实现

思路

如果用泛型类实现,则每次使用前还需要创建类对象。能不能把这一个步骤省去呢?答案是可以的,我们可以通过静态泛型方法来完成。

按照泛型方法的语法,我们对原代码稍作修改:

public class Util {public static  <E>  E findMax(E[] array) {...}
}

此时的Util类已经不再是泛型类了,而是一个普通类。通过在修饰符后添加 static <E> 将普通方法改为了静态泛型方法。但此时还不够完善,同样的,我们需要把类型参数E实现了Comparable接口这一约束体现出来。只需要把<E>改为 <E extends Comparable<E>> 即可。

代码 

public class Util {public static  <E extends Comparable<E>>  E findMax(E[] array) {E max = array[0];for (int i = 0; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}

此时,测试时的代码也更加简略了:

public class Test {public static void main(String[] args) {Tmp tmp1 = new Tmp(10,"substantial");Tmp tmp2 = new Tmp(20,"circumspect");Tmp tmp3 = new Tmp(5,"coby");Tmp[] array = {tmp1,tmp2,tmp3};System.out.println("max is " + Util.findMax(array));}
}

依旧能够正确运行


三、拓展:数组排序(以冒泡排序为例)

1、int类型 原代码

//Tmp.javapublic class Tmp{public static void bubbleSort(int[] array){for (int i = 0; i < array.length-1; i++) {boolean flag = false;for (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = true;}}if(!flag) {break;}}}
}
//Test.javaimport java.util.Arrays;public class Test {public static void main(String[] args) {int[] array = {0,3,1,8,9,6,4,5,2};Tmp.bubbleSort(array);System.out.println(Arrays.toString(array));}
}

2、泛型类

//Util.javapublic class Util<E extends Comparable<E>> {public void bubbleSort(E[] array){for (int i = 0; i < array.length-1; i++) {boolean flag = false;for (int j = 0; j < array.length-1-i; j++) {if(array[j].compareTo(array[j+1]) > 0) {E tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = true;}}if(!flag) {break;}}}
}
//Test.javaimport java.util.Arrays;public class Test {public static void main(String[] args) {Util<Integer> util = new Util<>();Integer[] array = {10,8,-33,7,21,78};util.bubbleSort(array);System.out.println(Arrays.toString(array));}
}

3、泛型方法

//Util.javapublic class Util {public static <E extends Comparable<E>> void bubbleSort(E[] array){for (int i = 0; i < array.length-1; i++) {boolean flag = false;for (int j = 0; j < array.length-1-i; j++) {if(array[j].compareTo(array[j+1]) > 0) {E tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = true;}}if(!flag) {break;}}}
}
//Test.javaimport java.util.Arrays;public class Test {public static void main(String[] args) {Integer[] array = {10,8,-33,7,21,78};Util.bubbleSort(array);System.out.println(Arrays.toString(array));}
}

拓展阅读: 🔗Java初识泛型 | 如何通过泛型类/泛型方法获取任意类型的三个数的最大值?


http://www.ppmy.cn/news/10241.html

相关文章

SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段

文章目录1.查询时的普遍写法2.问题分析2.1 计算负担2.2 IO负担2.3 覆盖索引失效2.4 缓存压力3.总结1.查询时的普遍写法 select * from the_table_name where ...2.问题分析 2.1 计算负担 数据库需要去解析更多的对象字段、权限、属性&#xff0c;查询数据字典将"*"…

风险事件标签识别之BiLSTM实现的代码+数据

项目介绍:   数据集:风险事件分类的训练集规模是10000+,包含10个一级标签和35个二级标签;大规模无标注的文本规模是亿级,可供选手选择用来进行语言模型训练。数据性质均为新闻资讯数据,并且进行了字符编码(保留了句子划分的标点符号),文中的字符会转换成唯一的ID,I…

哪些程序员适合自由工作?(附平台推荐)

在早些时候进行远程办公&#xff0c;接私活或者跨国进行编程&#xff0c;赚点外快等也不是什么奇怪的事情。但是那时候没有人想到会把这些工作完全变成自己的主要业务——也就是我们说的自由工作。也不知道是哪一个第1个吃了螃蟹的人发现自由工作还不错&#xff0c;于是经过后面…

WebLogic-执行队列

一&#xff0c;Tuning the Application Server 二&#xff0c;执行队列 Using Work Managers to Optimize Scheduled WorkThis chapter describes how WebLogic Server 12.1.3 lets you configure how your application prioritizes the execution of its work using a Work Ma…

【博学谷学习记录超强总结,用心分享|产品经理基础总结和感悟13】

这里写目录标题第一章、概述第二章&#xff0c;内容服务产品分析框架&#xff1a;用户-平台-创作者内容服务平台优化思考第一章、概述 在分析文字类内容产品之前&#xff0c;我们先来思考一下内容产品的本质是什么&#xff1f;笔者认为&#xff0c;所有满足用户需求的信息服务…

创建Vue3项目以及引入Element-Plus

创建Vue3项目以及引入Element-Plus 前提条件&#xff1a;本地需要有node环境以及安装了npm&#xff0c;最好设置了镜像&#xff0c;这样下载包的时候会快些。 1、安装vue脚手架vue-cli3 npm install vue/cli -g2、安装后查看vue的版本 vue -V3、创建Vue项目&#xff0c;项目…

(十三)JAVA基础语法

目录 前言: 一、包 二、权限修饰符 三、final关键字 四、常量 五、枚举 六、抽象类 七、抽象类:模板方法模式 八、接口 前言: ①包: 在编写Java程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也…

(1分钟了解)SLAM的七大问题:地图表示、信息感知、数据关联、定位与构图、回环检测、深度、绑架

编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;SLAM问题也被称为是CML问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…