Java教程

Java Comparator接口

Java Comparator接口用于对用户定义的类的对象进行排序。
此接口在java.util包中找到,包含2个方法compare(Object obj1,Object obj2)和equals(Object element)。
它提供了多个排序序列,即,您可以基于任何数据成员,例如rollno,名称,年龄或其他任何东西。

Java比较器接口的方法

方法 说明
public int compare(Object obj1, Object obj2) 它将第一个对象与第二个对象进行比较。
public boolean equals(Object obj) 用于将当前对象与指定对象进行比较。
public boolean equals(Object obj) 用于将当前对象与指定对象进行比较。

Collections类

Collections 类提供用于对集合元素进行排序的静态方法。如果集合元素是Set或Map,则可以使用TreeSet或TreeMap。但是,我们无法对List的元素进行排序。 Collections类还提供用于对List类型元素的元素进行排序的方法。
用于对List元素进行排序的Collections类的方法 公共无效排序(列表,比较器c): 用于按给定的比较器对List的元素进行排序。

Java比较器示例(非通用旧样式)

让我们看一下根据年龄和名称对List元素进行排序的示例。在此示例中,我们创建了4个Java类:
Student.java AgeComparator.java NameComparator.java Simple.java Student.java
此类包含3个字段rollno,name和age和一个参数化的构造函数。
class Student{
    int rollno;
    String name;
    int age;
    Student(int rollno,String name,int age){
        this.rollno=rollno;
        this.name=name;
        this.age=age;
    }
}
AgeComparator.java
此类基于年龄定义比较逻辑。如果第一个对象的年龄大于第二个对象的年龄,则我们将返回一个正值。可以是1、2、10之类的任何值。如果第一个对象的年龄小于第二个对象,我们将返回一个负值,它可以是任何负值,并且如果两个对象的年龄相等,我们将返回0。
import java.util.*;
class AgeComparator implements Comparator{
    public int compare(Object o1,Object o2){
        Student s1=(Student)o1;
        Student s2=(Student)o2;
        if(s1.age==s2.age)return 0;
        else if(s1.age>s2.age)return 1;
        elsereturn -1;
    }
}
NameComparator.java
此类提供了基于名称的比较逻辑。在这种情况下,我们使用String类的compareTo()方法,该方法在内部提供比较逻辑。
import java.util.*;
class NameComparator implements Comparator{
    public int compare(Object o1,Object o2){
        Student s1=(Student)o1;
        Student s2=(Student)o2;
        return s1.name.compareTo(s2.name);
    }
}
Simple.java
在此类中,我们将根据名称和年龄进行排序,以打印对象的值。
import java.util.*;
import java.io.*;
class Simple{
    public static void main(String args[]){
        ArrayList al=new ArrayList();
        al.add(new Student(101,"Vijay",23));
        al.add(new Student(106,"Ajay",27));
        al.add(new Student(105,"Jai",21));
        System.out.println("Sorting by Name");
        Collections.sort(al,new NameComparator());
        Iterator itr=al.iterator();
        while(itr.hasNext()){
            Student st=(Student)itr.next();
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
        System.out.println("Sorting by age");
        Collections.sort(al,new AgeComparator());
        Iterator itr2=al.iterator();
        while(itr2.hasNext()){
            Student st=(Student)itr2.next();
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
    }
}
Sorting by Name
106 Ajay 27
105 Jai 21
101 Vijay 23
Sorting by age
105 Jai 21
101 Vijay 23
106 Ajay 27

Java比较器示例(通用)

Student.java
class Student{
    int rollno;
    String name;
    int age;
    Student(int rollno,String name,int age){
        this.rollno=rollno;
        this.name=name;
        this.age=age;
    }
}
AgeComparator.java
import java.util.*;
class AgeComparator implements Comparator<
Student>
{
    public int compare(Student s1,Student s2){
        if(s1.age==s2.age)return 0;
        else if(s1.age>s2.age)return 1;
        elsereturn -1;
    }
}
NameComparator.java
此类提供了基于名称的比较逻辑。在这种情况下,我们使用String类的compareTo()方法,该方法在内部提供比较逻辑。
import java.util.*;
class NameComparator implements Comparator<
Student>
{
    public int compare(Student s1,Student s2){
        return s1.name.compareTo(s2.name);
    }
}
Simple.java
在此类中,我们将根据名称和年龄进行排序,以打印对象的值。
import java.util.*;
import java.io.*;
class Simple{
    public static void main(String args[]){
        ArrayList<Student> al=new ArrayList<Student>();
        al.add(new Student(101,"Vijay",23));
        al.add(new Student(106,"Ajay",27));
        al.add(new Student(105,"Jai",21));
        System.out.println("Sorting by Name");
        Collections.sort(al,new NameComparator());
        for(Student st: al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
        System.out.println("Sorting by age");
        Collections.sort(al,new AgeComparator());
        for(Student st: al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
    }
}
Sorting by Name
106 Ajay 27
105 Jai 21
101 Vijay 23
Sorting by age
105 Jai 21
101 Vijay 23
106 Ajay 27

Java 8 Comparator接口

Java 8 Comparator接口是仅包含一种抽象方法的功能接口。现在,我们可以将Comparator接口用作lambda表达式或方法引用的分配目标。

Java 8 Comparator接口的方法

方法 说明
int compare(T o1,T o2) 它将第一个对象与第二个对象进行比较。
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor) 它接受一个函数,该函数从类型T中提取一个Comparable排序键,并返回一个Comparator 通过该排序键进行比较。
static <T,U> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator) 它接受一个函数,该函数从类型T中提取一个排序键,然后返回一个Comparator 使用指定的比较器按该排序键进行比较。
static <T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) 它接受一个函数,该函数从类型T中提取一个双精度排序键,并返回一个Comparator 通过该排序键进行比较。
static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) 它接受一个函数,该函数从类型T中提取一个int排序键,并返回一个Comparator 通过该排序键进行比较。
static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) 它接受一个函数,该函数从类型T中提取一个长排序键,然后返回一个Comparator 通过该排序键进行比较。
boolean equals(Object obj) 用于将当前对象与指定对象进行比较。
static <T extends Comparable<? super T>> Comparator<T> naturalOrder() 它返回一个比较器,该比较器以自然顺序比较可比较对象。
static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) 它返回一个比较器,该比较器将null小于非null元素。
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) 它返回一个比较器,该比较器将null视为大于非null元素。
default Comparator<T> reversed() 它返回比较器,其中包含所提供比较器的逆序。
static <T extends Comparable<? super T>> Comparator<T> reverseOrder() 它返回包含自然顺序相反的比较器。
default Comparator<T> thenComparing(Comparator<? super T> other) 它返回字典顺序比较器和另一个比较器。
default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor) 它返回字典顺序比较器,该函数具有提取Comparable排序键的功能。
default <U> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator) 它返回字典顺序比较器,该函数具有提取要与给定Comparator比较的键的功能。
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) 它返回字典顺序比较器,该函数具有提取双重排序键的功能。
default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) 它返回按字典顺序排序的比较器,该函数具有提取int排序键的功能。
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) 它返回字典顺序比较器,该函数具有提取长排序键的功能。

Java 8比较器示例

让我们看一下根据年龄和名称对List元素进行排序的示例。
文件: Student.java
class Student {
    int rollno;
    String name;
    int age;
    Student(int rollno,String name,int age){
        this.rollno=rollno;
        this.name=name;
        this.age=age;
    }
    public int getRollno() {
        return rollno;
    }
    public void setRollno(int rollno) {
        this.rollno = rollno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
文件: TestSort1.java
import java.util.*;
public class TestSort1{
    public static void main(String args[]){
        ArrayList<Student> al=new ArrayList<Student>();
        al.add(new Student(101,"Vijay",23));
        al.add(new Student(106,"Ajay",27));
        al.add(new Student(105,"Jai",21));
        Comparator<Student> cm1=Comparator.comparing(Student::getName);
        Collections.sort(al,cm1);
        System.out.println("Sorting by Name");
        for(Student st: al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
        Comparator<Student> cm2=Comparator.comparing(Student::getAge);
        Collections.sort(al,cm2);
        System.out.println("Sorting by Age");
        for(Student st: al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
    }
}
Sorting by Name
106 Ajay 27
105 Jai 21
101 Vijay 23
Sorting by Age
105 Jai 21
101 Vijay 23
106 Ajay 27

Java 8比较器示例: nullsFirst()和nullsLast()方法

在这里,我们对也包含null的元素列表进行排序。
文件: Student.java
class Student {
    int rollno;
    String name;
    int age;
    Student(int rollno,String name,int age){
        this.rollno=rollno;
        this.name=name;
        this.age=age;
    }
    public int getRollno() {
        return rollno;
    }
    public void setRollno(int rollno) {
        this.rollno = rollno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
文件: TestSort2.java
import java.util.*;
public class TestSort2{
    public static void main(String args[]){
        ArrayList<Student>al=new ArrayList<Student>();
        al.add(new Student(101,"Vijay",23));
        al.add(new Student(106,"Ajay",27));
        al.add(new Student(105,null,21));
        Comparator<
        Student>
        cm1=Comparator.comparing(Student::getName,Comparator.nullsFirst(String::compareTo));
        Collections.sort(al,cm1);
        System.out.println("Considers null to be less than non-null");
        for(Student st: al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
        Comparator<
        Student>
        cm2=Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo));
        Collections.sort(al,cm2);
        System.out.println("Considers null to be greater than non-null");
        for(Student st: al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
    }
}
Considers null to be less than non-null
105 null 21
106 Ajay 27
101 Vijay 23
Considers null to be greater than non-null
106 Ajay 27
101 Vijay 23
105 null 21
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4