首页 > 编程知识 正文

重写comparable接口,抽象类与接口区别

时间:2023-05-03 06:51:36 阅读:153760 作者:2807

JDK8中Comparable Comparable接口的源代码:

package java.lang; import java.util.*; package java.lang; publicinterfacecomparablet { public int compare to (to ); )使用方法:

publicclassuserimplementscomparableuser { privateintegerid; 私有整合者; public User () public user (integer id,Integer age ) ) { this.id=id; this.age=age; }公共集成器getid () { return id; }publicvoidsetid(integerid ) { this.id=id; } public Integer getAge () { return age; }公共void setage (integer age ) { this.age=age; } @Override public String toString (() return'user ) )、id )、age=' age '} ); }publicintcompareto(usero ) if ) this.ageo.getage ) ) { return 1; }elseif(this.ageo.getage ) ) { return -1; }else{ return 0; } } public class test { publicstaticvoidmain (string [ ] args ) useruser1=newuser ) 1,14 ); useruser2=new user (2,12 ); 用户3=新用户(3,10 ); User[] users={user1,user2,user3}; Arrays.sort(users ); Arrays.stream(users ).Foreach ) system.out:3360println; }} int compareTo(T o)

将此对象与指定对象的顺序进行比较。 如果对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

参数: o -要比较的对象。

返回值:负整数、零或正整数,具体取决于是小于、等于还是大于指定对象。

抛出: ClassCastException -如果指定的对象类型不允许与此对象进行比较

JDK8中Comparator Comparator接口的源代码:

package java.util; import java.io.Serializable; import Java.util.function.function; import Java.util.function.to int function; import Java.util.function.to long function; import Java.util.function.todouble function; import java.util.Comparators; publicinterfacecomparatort { int compare (to1,T o2 ); //还有很多其他方法. }使用:

公共类角色{ privateintegerid; 私有整合者; public Child () public Child )、integerid、Integer age )、{ this.id=id; this.age=age; }公共集成器getid () { return id; }publicvoidsetid(integerid ) { this.id=id; } public Integer getAge () { return age; }公共void setage (integer age ) { this.age=age; } @Override

public String toString() { return "Child{" + "id=" + id + ", age=" + age + '}'; }} public class Test { public static void main(String[] args) { Child child1 = new Child(1, 14); Child child2 = new Child(2, 12); Child child3 = new Child(3, 10); List<Child> list = new ArrayList<>(); list.add(child1); list.add(child2); list.add(child3); Collections.sort(list, new Comparator<Child>() { @Override public int compare(Child o1, Child o2) { return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1); } }); // 或者使用JDK8中的Lambda表达式 //Collections.sort(list, (o1, o2) -> (o1.getAge()-o2.getAge())); list.stream().forEach(System.out::println); }}

或者也可以通过实现的方式使用Comparator接口:

import java.util.Comparator;public class Child implements Comparator<Child> { private Integer id; private Integer age; public Child() { } public Child(Integer id, Integer age) { this.id = id; this.age = age; } @Override public int compare(Child o1, Child o2) { return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Child{" + "id=" + id + ", age=" + age + '}'; }} public class Test { public static void main(String[] args) { Child child1 = new Child(1, 14); Child child2 = new Child(2, 12); Child child3 = new Child(3, 10); List<Child> list = new ArrayList<>(); list.add(child1); list.add(child2); list.add(child3); Collections.sort(list, new Child()); list.stream().forEach(System.out::println); }} Comparator接口其他默认方法的用法

reversed方法

default Comparator<T> reversed() { return Collections.reverseOrder(this); }

这个方法是用来生成一个逆序器,比如我们开始需要得到一个正序的排序序列,然后又想得到一个反转的排序序列,就可以使用该方法。比如:

public class Test { public static void main(String[] args) { Child child1 = new Child(1, 14); Child child2 = new Child(2, 12); Child child3 = new Child(5, 10); Child child4 = new Child(4, 10); List<Child> list = new ArrayList<>(); list.add(child1); list.add(child2); list.add(child3); list.add(child4); Comparator<Child> comparator = Comparator.comparingInt(x -> x.getAge()); Collections.sort(list, comparator); list.stream().forEach(System.out::println); Collections.sort(list, comparator.reversed()); list.stream().forEach(System.out::println); }}

thenComparing

default <U extends Comparable<? super U>> Comparator<T> thenComparing( Function<? super T, ? extends U> keyExtractor) { return thenComparing(comparing(keyExtractor)); }

该方法是在原有的比较器上再加入一个比较器,比如先按照年龄排序,年龄相同的在按照id排序。比如:

public class Test { public static void main(String[] args) { Child child1 = new Child(1, 14); Child child2 = new Child(2, 12); Child child3 = new Child(5, 10); Child child4 = new Child(4, 10); List<Child> list = new ArrayList<>(); list.add(child1); list.add(child2); list.add(child3); list.add(child4); Comparator<Child> comparator = Comparator.comparingInt(x -> x.getAge()); Collections.sort(list, comparator); list.stream().forEach(System.out::println); System.out.println("-----"); Collections.sort(list, comparator.thenComparing(x->x.getId())); list.stream().forEach(System.out::println); }} Comparable接口和Comparator接口的区别 Comparable接口位于java.lang包下;Comparator位于java.util包下Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。