Java超详细:泛型、接口与继承的应用实例讲解

3 篇文章 0 订阅

题目概括:

  • 定义一个shape总图形,分支出圆形和矩形两个类
  • 定义一个排序的接口,分支出两种排序方法
  • 定义一个比较的接口,分支出三种比较的方式
  • 定义主函数,实现部分排序

一、shape接口

包含获取面积、x,y坐标的方法

public interface shape {
   public double area();
   public int get_x();
   public int get_y();
}

二、Rect类

定义矩形的长和宽、构造函数、实现shape的方法

public class Rect implements shape{
        public int x;
        public int y;
        
        Rect(int xx,int yy){
        	this.x=xx;
        	this.y=yy;
        }
        
        public double area() {		
    		return x*y;		
    	}
        
    	public int get_x() {
        	return this.x;
        }
        public int get_y() {
        	return this.y;
        }
}

三、Circle类

定义圆的圆心坐标、半径、构造函数、实现shape的方法

public class Circle implements shape {
	
	public int x;
	public int y;
	public int r;
	
	Circle(int xx,int yy,int rr){
		this.x=xx;
		this.y=yy;
		this.r=rr;
	}
	
	public double area() {		
		return r*r*3.14;		
	}
	
	public int get_x() {
    	return this.x;
    }
    public int get_y() {
    	return this.y;
    }
}

四、定义比较的接口

用泛型的形式

public interface Comparator<E> {
	public boolean compare(E s1,E s2);
}

五、定义面积的比较方法

其中<E extends shape>的写法是必须的,这个是泛型的继承,泛型继承了这个类,就可以调用这个类的方法,不然不能调用是s1.area()的方法

public class AreaComparator<E extends shape> implements Comparator<E> {
	public boolean compare(E s1,E s2) {
		return (s1.area()>s2.area()) ? true :false;
	}
}

六、定义x坐标的比较方法

public class XComparator <E extends shape> implements Comparator<E> {
	public boolean compare(E s1,E s2) {
		return (s1.get_x()>s2.get_x()) ? true :false;
	}
}

七、定义y坐标的比较方法

public class YComparator <E extends shape> implements Comparator<E> {
	public boolean compare(E s1,E s2) {
		return (s1.get_y()>s2.get_y()) ? true :false;
	}
}

八、定义排序的接口

 将比较的方法作为参数传进来可以减少代码的量,不用每种排序类的内部都写上这三种比较方法

public interface ISorter<E> extends Comparator<E>{
    public void sorter(List<E> ss,Comparator<E> c);
}

九、定义冒泡排序的方法

Collections.swap()方法可以减少代码量

public class BubbleSorter<E extends shape> extends AreaComparator<E> implements ISorter<E>{
	public void sorter(List<E> ss,Comparator<E> c) {
		for(int i=0;i<ss.size()-1;i++) {
			for(int j=0;j<ss.size()-1-i;j++) {
				if(c.compare(ss.get(i), ss.get(j))) {
					Collections.swap(ss, i, j);
					
				}
			}
		}
	}

}

十、定义选择排序的方法

public class SelectSorter <E extends shape> extends AreaComparator<E> implements ISorter<E>{
	public void sorter(List<E> ss,Comparator<E> c) {
		for(int i=0;i<ss.size();i++) {
			int minindex=i;
			for(int j=i+1;j<ss.size();j++) {
				if(c.compare(ss.get(minindex), ss.get(j))) {
		    		   minindex=j;
		    	   } 
		    		Collections.swap(ss, minindex, j);				
			}
		}
	}
}

十一、定义主函数

public class Main {
	public static void main(String[] args) {
		System.out.println("---------面积-----------");
		ArrayList<shape> ss=new ArrayList<shape>();
		int count = 11;
		shape s;
		for (int i=1;i<count;i++) {
			s=new Rect(i,2*i);
			ss.add(s);
		}
		 ISorter<shape> isorter = new SelectSorter<shape>();
		 Comparator<shape> c= new AreaComparator<shape>();
		 isorter.sorter(ss,c);
		 for(int i=0;i<ss.size();i++) {
		 System.out.println(ss.get(i).area());
		 }
		 
		 System.out.println("---------坐标-----------");
		 ArrayList<shape> ss1=new ArrayList<shape>();
			for (int i=1;i<count;i++) {
				s=new Circle(i,2*i,i);
				ss1.add(s);
			}
			 ISorter<shape> isorter1 = new SelectSorter<shape>();
			 Comparator<shape> c1= new XComparator<shape>();
			 isorter1.sorter(ss1,c1);
			 for(int i=0;i<ss1.size();i++) {
			 System.out.println(ss1.get(i).get_x());
			 } 
	}
}

完整的工作区展示:

 关于lambda表达式的写法可以参考这篇文章:

该程序的lambda表达式写法

但是这个程序在BubbleSorter上面有点bug,有看出来的小伙伴可以告诉我~

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值