题目概括:
- 定义一个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表达式的写法可以参考这篇文章:
但是这个程序在BubbleSorter上面有点bug,有看出来的小伙伴可以告诉我~