泛型限定的练习。获取Collection集合中的最大值

/**

*    泛型限定的练习。★★★★★

获取Collection集合中的最大值。(解决问题按照一下的要求做)

1 先定义了一个方法中明确具体元素类型的getMax_1。

2 由于getMax_1无法获取其他类型元素的最大值。提高扩展性,操作所有对象。

就升级为了Object 。getMax_2

3 因为定义成Object,什么类型都可以接收,容易出现运行时的ClassCastException

所以使用泛型,对要操作的元素进行类型的限定。

思路:

1.获取元素最大值的方法,通常是拿一个对象作为最大值,和遍历出的每一个元素比对,只要比这个最大值大即

赋值给最大值.

2.按照题目要求,第一步,首先定义一个方法中明确具体元素类型的getMax_1方法.

3.那么就需要指定泛型,来对方法的参数类型做限定

public class GenericTest3 {

    public static void main(String[] args) {
        //1.创建一个集合Collection
        Collection<Student> c1 = new ArrayList<Student>();
        c1.add(new Student("xiaoming",5));
        c1.add(new Student("zhangsan",15));
        c1.add(new Student("lisi",7));
        c1.add(new Student("xia",12));

        //2.定义一个方法,明确具体元素类型为Student的方法getMax_1
        Student stuMax = getMax_1(c1);
        System.out.println("Student中的最大值"+stuMax);

        //3.由于getMax_1的方法,只能传入Student类型的元素,扩展性不好.重写方法getMax_2
        //用Obeject类型,可以传入任何类型的参数
        Collection objList = new ArrayList();
        objList.add(new Worker("xiaolu",35));
        objList.add(new Worker("luf",25));
        objList.add(new Worker("xuze",28));
//        objList.add("string");    方法2是解决了类型的局限性,甚至1个集合传入两个数据类型,造成运行时异常
        Object objMax = getMax_2(objList);
        System.out.println("Object中的最大值"+objMax);

        //4.为了解决方法1的局限性,方法2的不稳定因素,方法3加入泛型,定义上限,下限
        Collection<Worker> c2 = new ArrayList<Worker>();
        c2.add(new Worker("xiaolu",35));
        c2.add(new Worker("luf",25));
        c2.add(new Worker("xuze",28));

        Student stumax3 = getMax_3(c1);
        Worker wokermax3 = getMax_3(c2);
        Object objmax3 = getMax_3(objList);
        System.out.println("Student中的最大值"+stumax3);
        System.out.println("Worker中的最大值"+wokermax3);
        System.out.println("Object中的最大值"+objmax3);

    }

    /**
     * 方法3:可以接收任何类型的集合取最大值的方法.
     * 注意:取最大值,需要comparTo方法的主持,所以传入的对象,必须具备比较方法,即必须实现Comparable
     * 接口的对象才行.或者说,这个对象类本身并不具备比较方法,但是其父类具备比较方法,那么可以
     * 这样限定<? super 需要用比较方法的那个对象>,这个限定放在什么位置?
     * 注意:静态方法,就不能把这个泛型参数放在类上了,而是放在方法上.
     * 其次,传入对象的类型可以是这个对象或者这个对象的子类型.<? extends 这个对象>
     *
     */
    public static <T extends Comparable<? super T>> T getMax_3(Collection<? extends T> c1) {
        Iterator<? extends T> it = c1.iterator();
        T ifMax = it.next();
        while(it.hasNext()){
            T temp = it.next();
            if(temp.compareTo(ifMax)>0){
                ifMax = temp;
            }
        }
        return ifMax;
    }

    /**
     * 对方法1进行了改造,能接收所有类型的集合,求出最值并返回
     * 但是思考?还有没有弊端呢?
     * @param objList
     * @return
     */
    public static Object getMax_2(Collection objList) {
        Iterator it = objList.iterator();
        Object ifMax = it.next();
        while(it.hasNext()){
            //此处temp必须用Comparable接口的子类型才行,因为需要compareTo方法
            Comparable temp =(Comparable) it.next();
            if(temp.compareTo(ifMax)>0){
                ifMax = temp;
            }
        }
        return ifMax;
    }

    /**
     * 按要求1完成
     * 求Student集合中最大值的方法
     * 但是有局限性,传入其他不是Student类型的集合无法获取最大值.
     * @param c1    限定传入Student类型的Collection集合.
     * @return    Student     返回Student类型的最大值.
     */
    public static Student getMax_1(Collection<Student> c1) {
        Iterator<Student> it = c1.iterator();
        Student ifMax = it.next();
        while(it.hasNext()){
            Student temp = it.next();
            if(temp.compareTo(ifMax)>0){
                ifMax = temp;
            }
        }
        return ifMax;
    }
}

时间: 2024-10-20 22:14:45

泛型限定的练习。获取Collection集合中的最大值的相关文章

java.util.Map按照key值合并的value的Collection 集合中。

用java实现把多个map的内容合并的一个resultMap中 代码大致如下 /** * @author Shalf */ public class MapUtil { /** * 把partMap数据合并放到resultMap中. * @param resultMap * @param partMap */ public static <T, F, K extends Collection<F>> void merge2ResultMap(Map<T, K> resu

C#获取一个数组中的最大值、最小值、平均值

C#获取一个数组中的最大值.最小值.平均值 1.给出一个数组 1 int[] array = new int[] { 1,2,4,3,0,-1,34,545,2,34}; 2.数组Array自带方法 本身是直接可以调用Min(),Max(),Average()方法来求出 最小值.最大值.平均值 1 Console.WriteLine("--------------Array自身方法-----------------"); 2 Console.WriteLine("Min:{0

Java Collection集合中的iterator方法

Iterator接口的概述 /** * java.util.Iterator接口:选代器(对集合进行遍历) * 有两个常用的方法 * boolean hasNext() * 如果仍有元素可以迭代,则返回true. * 即判断集合中还有没有下ー个元素,有就返回true,没有就返回 false * E next() * 返回送代的下一个元素. * 即取出集合中的下一个元素 * iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象. * 获取实现类的方式比较特

遍历Collection集合中的6种方法:

下面的代码演示了遍历Collection集合的6种方法,注意Collection集合的遍历远不止于增强for循环,和迭代器两种. 代码如下: 1 package com.qls.traverse; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.Enumeration; 7 import java.util.Iterator;

获取map集合中键和值的三种方式

//创建一个map集合 HashMap<String, Integer> map = new HashMap<>(); //添加元素 map.put("小王",25); map.put("小张",35); map.put("小李",20); 方法一:用增强for循环 //用keyset()方法获取所有的键 Set<String> keys = map.keySet(); for(String s:keys){

Collection集合中各子集合的差别

一.HashMap和HashTable的差别 1.HashMap能允许一个null key和多个null value值:HashTable不允许为null: 2.HashMap不同步非安全:HashTable是同步的,线程安全. 3.两者加载因子都是0.75:但是扩容增量存在差别:HashMap为1倍,HashTable为2倍+1: 二.ArrayList.Vector.LinkedList差别 1.ArrayList与Vector的差别 底层都是数组结构: Vector扩容是2倍:ArrayL

获取map集合中的键和值

1.根据键找值 public static void main(String[] args) { //创建集合对象 Map<String ,Integer> map=new HashMap<String ,Integer>(); //创建元素并添加到集合 map.put("hello", 1); map.put("world", 2); Set <String> set=map.keySet(); for(String key:s

Collection集合中的List常用实现类跟方法

简述一下我对List的一个认识,理解的不是很深刻,所以没有涉及原理性的东西,主要用于自己今后的知识梳理回顾,当然如果能帮到大家就更好了. List一个位于Util包中的接口,其常用实现类ArrayList,LinkedList.ArrayList基于数组编写,LinkedList基于链表编写,这里只说List接口的方法,所以就以ArrayList为例,就不介绍子类自有的特性了,话不多说直接上代码. 1 import java.util.ArrayList; 2 import java.util.

JavaScript中获取Map集合中的key和value值(前提是:既不知道key为什么值,也不知道value有哪些值)

for(var i in maps){//通过定义一个局部变量i遍历获取map里面的所有key值 alert(maps[i]); //通过获取key对应的value值 }