当前位置: 首页 > 后端技术 > Java

算法回顾1——sort函数的使用和改写

时间:2023-04-01 13:27:33 Java

1.1arraylist.sort(Comparatorc)升序:sites.sort(Comparator.naturalOrder());**Comparator接口的naturalOrder()方法指定自然元素顺序(升序)排序。**降序:sites.sort(Comparator.reverseOrder());Comparator接口的reverseOrder()方法指定对元素进行倒序排序(降序)。1.2实现Comparable接口,重写compareTo()方法:例:对于Person对象,先按年龄升序排序,如果年龄相同,则按姓名升序排序ClassPersonimplementsComparable{}publicintcompareTo(Personp1){}类PersonclassPersonimplementsComparable{Stringname;年龄;publicPerson(Stringname,intage){this.name=name;这个。年龄=年龄;}@OverridepublicStringtoString(){返回"Person:name="+this.name+"age="+this.age;}//treeSet在添加元素时会多次调用该方法,使新填充的元素与已有元素进行对比,最终确定新添加元素的放置位置@OverridepublicintcompareTo(Personp1){//先按年龄升序排列,如果年龄相同,则按姓名升序排列if(this.age==p1.age){//字符串默认实现了compareTo方法returnthis.name.compareTo(p1.name);}else{//升序排列returnthis.age-p1.age;}}}test1.javapublicclasstest1{publicstaticvoidmain(String[]args){//TreeSet有序TreeSetset=newTreeSet<>();//初始化几个实例set.add(newPerson("A",14));set.add(新人("E",15));set.add(newPerson("F",12));set.add(新人("B",11));set.add(newPerson("G",17));set.add(新人("H",15));set.add(新人("A",10));set.add(新人("C",19));for(Personperson:set){System.out.println(person);}}}结果:1.3编写比较器的compare(Objecto1,Objecto2)方法使得实体类不需要继承Comparable接口要点:Person类不继承Comparable接口classPerson{字符串名称;年龄;publicPerson(Stringname,intage){this.name=name;这个。年龄=年龄;}@OverridepublicStringtoString(){返回"Person:name="+this.name+"age="+this.age;}}ClassMycomparator继承了Comparator比较器,重写了compare方法排列,如果年龄相同,则按姓名升序排列if(p1.age==p2.age){//字符串默认实现了compareTo方法returnp1.name.compareTo(p2.name);}else{//升序排序returnp1.age-p2.age;}}}test1.java初始化treeSet对象时,传入一个Comparator,用于比较treeSet内部的元素==关键点:==TreeSetset=newTreeSet(newMyComparator());publicclasstest1{publicstaticvoidmain(String[]args){//TreeSet有序TreeSetset=newTreeSet(newMyComparator());//初始化几个实例set.add(newPerson("A",14));set.add(新人("E",15));set.add(newPerson("F",12));set.add(新人("B",11));set.add(newPerson("G",17));set.add(新人("H",15));设置.add(新人("A",10));set.add(新人("C",19));for(Personperson:set){System.out.println(person);}}}1.4重写comparator比较器,匿名内部类的方式,不需要Mycomparator类Person类同1.3删除Mycomparator类test1.java使用匿名内部类重写comparator比较器:TreeSetset=newTreeSet(newComparator(){@Overridepublicintcompare(Personp1,Personp2){}};真实代码:publicclasstest1{publicstaticvoidmain(String[]args){//TreeSetorderedTreeSetset=newTreeSet(newComparator(){@Overridepublicintcompare(Personp1,Personp2){if(p1.age==p2.age){//字符串默认实现了compareTo方法returnp1.name.compareTo(p2.name);}else{returnp1.age-p2.age;}}});//初始化几个实例set.add(newPerson("A",14));set.add(newPerson("E",15));set.add(newPerson("F",12));set.add(newPerson("B",11));set.add(newPerson("G",17));set.add(新的Per儿子(“H”,15));set.add(新人("A",10));set.add(新人("C",19));for(Personperson:set){系统。out.println(人);}}}1.5对于List类或者数组,rewritecomparator的方法是不同的。Person类同1.3。删除Mycomparator类。首先声明ArrayList对象,使用Collectons.sort(objectname,newComparator){}方法重写comparator和sortstest1.javapublicclasstest1{publicstaticvoidmain(String[]args){ArrayLista=newArrayList<>();//初始化几个实例a.add(newPerson("A",14))a.add(newPerson("E",15));a.add(新人("F",12));a.add(新人("B",11));a.add(新人("G",17));a.add(新人("H",15));a.add(新人("A",10));a.add(新人("C",19));Collections.sort(a,newComparator(){@Overridepublicintcompare(Personp1,Personp2){if(p1.age==p2.age){//stringdefaultcompareTo方法已经实现returnp1.name.compareTo(p2.name);}else{returnp1.age-p2.age;}}});for(Personperson:a){System.out.println(person);}}}注意:如果是数组,重写方法如下:Arrays.sort(数组名,newComparator<数组元素类型>(){@Overridepublicintcompare(数组元素类型p1,数组元素类型p2){//规则}});