本文概述
- 收藏类
- Java比较器示例(非通用旧样式)
- Java比较器示例(通用)
- Java 8比较器示例
- Java 8 Comparator示例:nullsFirst()和nullsLast()方法
该接口在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) | 用于将当前对象与指定对象进行比较。 |
用于对List元素进行排序的Collections类的方法public void sort(List list, Comparator c):用于按给定的Comparator对List的元素进行排序。
Java比较器示例(非通用旧样式)让我们来看一个根据年龄和姓名对List元素进行排序的示例。在此示例中, 我们创建了4个Java类:
- Student.java
- AgeComparator.java
- NameComparator.java
- Simple.java
此类包含三个字段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;
else
return -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 23Sorting 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;
else
return -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 23Sorting by age
105 Jai 21
101 Vijay 23
106 Ajay 27
Java 8比较器界面
Java 8 Comparator接口是仅包含一种抽象方法的功能接口。现在, 我们可以将Comparator接口用作lambda表达式或方法引用的分配目标。
Java 8比较器接口的方法
方法 | 描述 |
---|---|
int compare(T o1, T o2) | 它将第一个对象与第二个对象进行比较。 |
静态< T, U扩展了Comparable < ?超级U > > 比较器< T> 比较(功能< ?超级T , ?扩展U> keyExtractor) | 它接受一个函数, 该函数从类型T中提取一个Comparable排序键, 然后返回一个与该排序键进行比较的Comparator。 |
静态< T, U> Comparator < T> 比较(Function < ?super T, ?extended U> keyExtractor, Comparator < ?super U> keyComparator) | 它接受一个函数, 该函数从类型T中提取一个排序键, 然后返回一个比较器, 该比较器使用指定的比较器通过该排序键进行比较。 |
静态< T> 比较器< T> compareDouble(ToDoubleFunction < ?super T> keyExtractor) | 它接受一个函数, 该函数从类型T中提取一个双精度排序键, 然后返回一个与该排序键进行比较的Comparator。 |
静态< T> 比较器< T> compareInt(ToIntFunction < ?super T> keyExtractor) | 它接受一个函数, 该函数从类型T中提取一个int排序键, 然后返回一个与该排序键进行比较的Comparator。 |
静态< T> 比较器< T> compareingLong(ToLongFunction < ?super T> keyExtractor) | 它接受一个函数, 该函数从类型T中提取一个长排序键, 然后返回一个与该排序键进行比较的Comparator。 |
boolean equals(Object obj) | 用于将当前对象与指定对象进行比较。 |
静态< T扩展Comparable < ?超级T > > 比较器< T> naturalOrder() | 它返回一个比较器, 该比较器以自然顺序比较可比较对象。 |
静态< T> Comparator < T> nullsFirst(Comparator < ?super T> 比较器) | 它返回一个比较器, 该比较器将null小于非null元素。 |
静态< T> Comparator < T> nullsLast(Comparator < ?super T> 比较器) | 它返回一个比较器, 该比较器将null大于非null元素。 |
默认Comparator < T> reversed() | 它返回包含所提供比较器的反向顺序的比较器。 |
静态< T扩展Comparable < ?超级T > > Comparator < T> reverseOrder() | 它返回包含自然顺序相反的比较器。 |
默认的Comparator < T> thenComparing(Comparator < ?super T> 其他) | 它返回一个字典顺序比较器和另一个比较器。 |
默认< U扩展Comparable < ? super U > > Comparator < T> thenComparing(Function < ?super T, ?extended U> keyExtractor) | 它返回具有按可比排序键提取功能的字典顺序比较器。 |
默认< U> Comparator < T> thenComparing(Function < ?super T, ?extended U> keyExtractor, Comparator < ?super U> keyComparator) | 它返回字典顺序比较器, 该函数具有提取要与给定Comparator比较的键的功能。 |
默认Comparator < T> thenComparingDouble(ToDoubleFunction < ?super T> keyExtractor) | 它返回一个字典顺序比较器, 该函数具有提取双精度排序键的函数。 |
默认Comparator < T> thenComparingInt(ToIntFunction < ?super T> keyExtractor) | 它返回字典顺序比较器, 该函数具有提取int排序键的函数。 |
默认Comparator < T> thenComparingLong(ToLongFunction < ?super T> keyExtractor) | 它返回一个字典顺序比较器, 该函数具有提取长排序键的功能。 |
档案: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));
//Sorting elements on the basis of name
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);
}
//Sorting elements on the basis of 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 Comparator示例: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
推荐阅读
- ArrayList和LinkedList之间的区别
- Java Comparable接口
- Java中的集合
- Java WindowListener接口
- Java MouseMotionListener接口
- Java MouseListener接口
- 39个无需注册的最佳免费电子书下载网站推荐合集
- 路由器上的WPS按钮是什么(它是如何工作的?)
- 如何在Mac上截屏(Mac截屏的7种最佳方法)