我不知道是为啥,最近特别想写博客,在这里不仅仅能复习,还可能在写的同时,想到新的东西,感觉很棒,所谓温故而知新吧!
那么开始今天的话题:在之前有一篇博客写到对一个对象排序的程序段,在那个里面提到了comparator接口,但是在那个里面有的人可能不理解,现在详细讲一下。
什么时候我们需要使用这两个接口呢?
当然是在排序的时候了,一般时候我们都是拿collection.sort()方法来进行排序,那么……
static <T extends Comparable<? super T>>
void sort(List<T> list)
//根据元素的自然顺序 对指定列表按升序进行排序。
static <T> void
sort(List<T> list, Comparator<? super T> c)
//根据指定比较器产生的顺序对指定列表进行排序。
我查了一下Java API, 如上面一段代码
(1)第一个方法是传入List链,但是这个list必须是comparable类型的
(2)第二个方法是传入一个list链(泛型不泛型无所谓),再传入一个参数是comparator对象
那么且听我细细道来
首先我们设计一个类,叫什么呢?我喜欢一个动漫很久了,那么就拿这个举例吧
首先还是创建一个类,但是这个和之前的是有区别的,这个是能进行比较的对象。
public class OnePiece implements Comparable {
private String name;//名字
private int value;//赏金
private String FightName;//攻击技能
public OnePiece(String name,int value,String f) {
this.name = name;
this.value = value;
this.FightName = f;
}
@Override
public String toString() {
return String.format("%s %d %s", name, value, FightName);
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
OnePiece one = (OnePiece) o;
return this.value - one.value;
}
}
我设计了一个onepiece类,没错,你没有看错,就是海贼*,里面的三个成员都写上注释了。
这个类实现comparable接口,之后才能被collection.sort()方法进行排序,与此同时我们还要重写compareTo()方法,比较的内容是根据赏金进行升序排序。所以返回的就是本对象的赏金减去所比较对象的赏金。
那么我们写个main函数测试一下能不能进行排序
import java.util.*;
public class ComparableDemo {
public static void main(String [] args) {
List list = new ArrayList();
OnePiece [] o = {
new OnePiece("路飞",150000,"火拳铳"),
new OnePiece("索隆",78000,"三千世界"),
new OnePiece("山治",56000,"恶魔风脚")
};
for(int i = 0;i < o.length;i++) {
list.add(o[i]);
}
Collections.sort(list);
System.out.println(list);
}
}
看看输出结果:
[山治 56000 恶魔风脚, 索隆 78000 三千世界, 路飞 150000 火拳铳]
输出的的确是升序输出的。
但是我们想一下,如果说想要对其他的数据进行排序呢?假如说我的类里面还要加上一个数据叫:等级。之后想达到的目的是按照等级进行排序,如果那样达的话,我们要改这个类吗?会不会太麻烦了?
那么,不还有一个sort方法呢吗?
我们在这个方法上做点文章。
设计一个类,叫做comparevalue类,实现comparator接口,重写compare方法
import java.util.Comparator;
public class CompareValue implements Comparator{
@Override
public int compare(Object arg0, Object arg1) {
// TODO Auto-generated method stub
OnePiece o1 = (OnePiece) arg0;
OnePiece o2 = (OnePiece) arg1;
return o1.getValue() - o2.getValue();
}
}
重写的compare方法和那个compareto方法也类似,只不过需要从类里面提取一下赏金数据而已,自己理解一下。
排序的结果都是一样的。
好了,我感觉写的也差不多了,写了一个半小时,感觉好累呀,但是非常充实啊,每天进步一点点,我肯定能变厉害的,加油!
(对了,我之前还写了个关于Collection sort方法的博客,大家有兴趣的话,就看看吧)
多多点赞,会变好看,多多留言,会变有钱,好了,大家,一起加油哦,灰灰了。
来源:CSDN
作者:爱出bug的代码小白
链接:https://blog.csdn.net/qq_43073128/article/details/89204968