【EduCoder】泛型程序设计——比较

泛型是一种抽象级别较高的程序设计机制,它可以将不同类型对象的同一种操作加以抽象、封装,使其有更广泛的代码重用性。是对不同类型数据实施同一种操作的重用体现。在程序设计中,经常遇到不同的数据类型可以实施同一种操作的情形。

1本关任务-定义泛型类

补充完成右侧泛型程序设计代码,并通过测试。

提示

泛型的定义:

public class A< T>{
    private T t;
    public A(T t){this.t=t;}
    public T getT(){return t;}
    public void setT(T t){this.t=t;}
    public String toString(){return " "+t;}
}

在这个类中引入了类型参数T,这个参数书写在类名之后并用一对尖括号括起来。 有了这个定义就可以按照下列方式使用它。

A i= new A<Integer>(new Integer(20));
A s= new A<String>("Hello");
A d= new A<Double>(3.0);
i.getT();
s.getT();
d.getT();
System.out.println(i+" "+s+" "+d);}

输出结果:20 Hello 3.0

说明:在类A的定义中,没有指定数据成员t必须是某一种特定类型,而将其定义为了泛型数据T,只有在使用时,即测试类中才具体指定,对数据类型定义。
在测试类中,定义类A的对象,i,s,d时,将类型参数T替换为Integer,表示类中所有T的位置都为Integer;将类型参数T替换为String,表示类中所有T的位置都为String,这样既能让各种类型重用同一段程序代码,又可以避免人为地强制类型转换带来的错误

注意

在实例化泛型类时不允许带入基本数据类型。例如,A< double>是错误的,必须写成A< Double>

过关提示

有时需要对参数类型加以限定。例如,要求带入的类必须具有比较大小的功能,即这些类必须实现Comparable接口。表示这种限定的格式为:

public class A < T extends Comparable>{
...
}

< T extends Comparable>的含义是T限定为Comparable的子类。注意,尽管Comparable是接口,但在这里用extends关键字,而不用implements关键字。

本关中需要实现compare()方法,返回两个对象中较大者。用到了下面的compareto()方法,其中obj1,obj2是两个类型相同的对象。
obj1.compareTo(obj2)返回大于0,小于0,等于0的值,代表对象obj1大于、小于和等于对象obj2。

编程要求

补充完成右侧泛型程序设计代码,定义泛型类,实现两个对象的比较,并输出最大者。输入的数据可能是整数,也可能是浮点数,也可能是字符串。

字符串比大小,按照字母顺序,如c>a。

开始你的任务吧,祝你成功!

答案代码:
package step1;

public class A< T extends Comparable >{
 private T t1,t2; 
/*************BEGIN**************/
    public A(T t1, T t2) {
        this.t1 = t1;
        this.t2 = t2;
    }

    public T getT1() {
        return t1;
    }

    public T getT2() {
        return t2;
    }

    public void setT(T t1, T t2) {
        this.t1 = t1;
        this.t2 = t2;
    }
    public T compare(){
        if(t1.compareTo(t2) >= 0) return t1;
        else return t2;
    }
    @Override
    public String toString() {
        return ""+t1+""+t2;
    }
/*************END*****************/
}


2本关任务-泛型使用

根据泛型类A的定义,补充完成右侧测试类代码。类A的定义可通过右侧文件夹查看。

测试类A_Test中,定义了集合类ArrayList的对象array来完成操作,将输入的5对数作为array的元素顺序加入,之后按要求输出每一对儿数,并输出每一对儿数中较大者。

ArrayList操作:
get(i):获取第i个元素。
add(i):将元素加入ArrayList

相关知识

List和ArrayList都属于集合Collection的子类,可存储不同类型的数据。因此,可以将集合中的数据用泛型表示。如:

例1:

使用泛型:

List<T> list=new ArrayList<T>();
T t=list.get(0); 

不使用泛型:

List list=new ArrayList(); 
T t=(T)list.get(0); 

由于可以向list中添加任何类对象,如不使用泛型,在后面的使用中,很可能会出现类型转化的错误。

list.add("World");
list.add("Hello");
String str1 = (String) list.get(0);
Integer value=(Integer)list.get(1);

显然,list.get(1) 应该返回String类对象的引用,所以将其强制转换为Integer类是错误的。

例2:

使用了泛型:

ArrayList <Student> array = new ArrayList();
for(int i=0;i<array.size();i++){
  Student student=array.get(i);//不需要强制类型转换
} 

不加泛型:

ArrayList  array = new ArrayList();
for(int i=0;i<array.size();i++){
 Student student=(Student)array.get(i);//需要强制类型转换
 }
编程要求

补充右侧程序,实现获取输入5组数据,比较每组数据的大小,输出大的,并且将5组数据输出。

要求用ArrayList结合泛型类A,实现对输入的一对数据进行比较,如:(3,a),(6,5.388),并按照字符串比大小的规则,输出大的那个。数据类型可以不同,按照字符比大小的规则,a-z,顺序在前的小,后面的大。两个以上的,先比第一个,然后比第二个。如:a<b,aa<ab,abc<abd

开始你的任务吧,祝你成功!

答案代码
package step1;
import java.util.*;
public class A_Test {
	public static void main(String args[]){
		Scanner scan=new Scanner(System.in);
		ArrayList<A> array=new ArrayList<A>();
		String s1,s2;
		for(int i=0;i<5;i++){
		/******************BEGIN*************/
		s1 = scan.next();
		s2 = scan.next();
		array.add(new A<String>(s1, s2));
		/******************END*************/
		}
		/******************BEGIN*************/
		System.out.println(array.toString());
        for (A num:
             array) {
            System.out.println(num.toString()+ ": "+num.compare()+" is bigger");
        }
		/******************END*************/
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值