自然排序与比较器排序的使用
创始人
2024-02-15 07:43:42

1、自然排序:java.lang.Comparable

Comparable 接口中只提供了一个方法: compareTo(Object obj) ,该方法的返回值是 int 。如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等。

总结为一句话:实现Comparable,重写 compareTo方法

案列:以TreeMap为例,默认的升序,可以重写自然排序的方法改变原有排序

public static void testComparable(){TreeMap tmp = new TreeMap();tmp.put(new Car(4), "肆");tmp.put(new Car(1), "壹");tmp.put(new Car(5), "伍");tmp.put(new Car(3), "三");tmp.put(new Car(2), "贰");System.out.println(tmp);//结果://{Car [price=5.0]=伍, Car [price=4.0]=肆, Car [price=3.0]=三, Car [price=2.0]=贰, Car [price=1.0]=壹}}

//自定义TreeMap排序方法 自然排序

class Car implements Comparable{private double price;@Overridepublic int compareTo(Car o) {// TODO Auto-generated method stubif(this.price>o.getPrice()){return -1;//大的往前排}else if(this.pricereturn 1;//小的往后排}else{return 0;}}@Overridepublic String toString() {return "Car [price=" + price + "]";}

2、比较器排序:java.util.Comparator

总结为一句话:实现Comparator 接口,重写compare方法

public static void testComparator(){//HashMap hm = new HashMap();TreeMap tmp = new TreeMap(new MyComparatorBigtoSmall());tmp.put(4, "肆");tmp.put(1, "壹");tmp.put(5, "伍");tmp.put(3, "三");tmp.put(2, "贰");//System.out.println(tmp);//默认排序结果:{1=壹, 2=贰, 3=三, 4=肆, 5=伍}System.out.println(tmp);//修改为比较器排序(升序){5=伍, 4=肆, 3=三, 2=贰, 1=壹}}//自定义TreeMap排序方法    比较器排序    class MyComparatorBigtoSmall implements Comparator{@Overridepublic int compare(Integer o1, Integer o2) {// TODO Auto-generated method stubreturn o2-o1;}}

自然排序的使用

第一步:使用空参构造创建一个TreeSet集合对象。

第二步:在自定义类中实现一个Comparable接口(注意,接口里要写泛型,而泛型的类型要与集合里的数据类型一致

第三步:重写里面的compareTo()抽象方法。抽象方法里要写排序规则,排序规则如下。

img

/** TreeSet集合来存储Student类型* */
public class MyTreeSet2 {public static void main(String[] args) {TreeSet ts = new TreeSet<>();Student s1 = new Student("xuyimiao",28);Student s2 = new Student("chenxuyuan",27);Student s3 = new Student("xiaoyufeng",29);Student s4 = new Student("caofengze",28);Student s5 = new Student("caofengze",30);ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);System.out.println(ts);}
}
public class Student implements  Comparable{private String name;private int age;public Student() {}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {//按照对象的年龄进行排序//主要判断条件int result = this.age - o.age;//次要判断条件result = result == 0 ? this.name.compareTo(o.getName()) : result;return result;}
}

比较器排序的使用

img

public class MyTreeSet4 {public static void main(String[] args) {TreeSet ts = new TreeSet<>(new Comparator() {@Overridepublic int compare(Teacher o1, Teacher o2) {//o1表示现在要存入的那个元素//o2表示已经存入到集合中的元素//主要条件int result = o1.getAge() - o2.getAge();//次要条件result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;return result;}});Teacher t1 = new Teacher("zhangsan",23);Teacher t2 = new Teacher("lisi",22);Teacher t3 = new Teacher("wangwu",24);Teacher t4 = new Teacher("zhaoliu",24);ts.add(t1);ts.add(t2);ts.add(t3);ts.add(t4);System.out.println(ts);}
}
public class Teacher {private String name;private int age;@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +'}';}
}

该使用哪一种方式?

img

如何理解?

//按长度进行排序
public class MyTreeSet5 {public static void main(String[] args) {TreeSet ts = new TreeSet<>(new Comparator() {@Overridepublic int compare(String o1, String o2) {//首先比较字符串长度是否相等,短的字符串放左边,长的字符串放右边int result = o1.length() - o2.length();//如果字符串长度相等,再来比里面的字母。ASCII码小的在左边,ASCII码大的在右边result = result == 0 ? o1.compareTo(o2) : result;return result;}});//Lambda表达式方法/*TreeSet ts = new TreeSet<>((String o1, String o2) -> {int result = o1.length() - o2.length();result = result == 0 ? o1.compareTo(o2) : result;return result;});*/ts.add("c");ts.add("ab");ts.add("df");ts.add("qwer");System.out.println(ts);}
}

上面这串代码中,由于Java自带的String类中已经重写了Comparable接口,我们没法再修改。所以只能使用比较排序。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...