Java中的Collections.reverseOrder()及其示例
Collections类本身就在java.util包中,reverseOrder()方法返回一个比较器,我们可以使用它来反转Collection的顺序。自然排序是对象自己的compareTo方法所强制的排序。
语法:
public static Comparator reverseOrder()
参数: 要通过返回的比较器反转其排序的比较器(也可以为null)
返回类型: 该比较器会将实现Comparable接口的对象集合反向排序的自然排序反向排序。
现在,为了更深入地理解基本原理,我们将涵盖以下不同的用例 s:
- 对列表按降序排序
- 对数组按降序排序
- 在存在用户定义的比较器以进行反向排序时,按降序对学生进行卷号排序。
用例1: 对列表按降序排序
示例
// Java程序演示Collections类的reverseOrder()方法的工作
// 对列表按降序排序
//导入所需的实用程序类
import java.util.*;
//主类Collectionsorting
public class GFG {
//主驱动程序方法
public static void main(String[] args) {
//为其创建一个空ArrayList对象的整数列表
ArrayList al=new ArrayList();
//自定义输入整数元素
al.add(30);
al.add(20);
al.add(10);
al.add(40);
al.add(50);
//使用Collections类的sort()方法对元素进行排序,传递列表并使用reverseOrder()方法按降序排序
Collections.sort(al, Collections.reverseOrder());
//最后在控制台上打印降序排序的列表
System.out.println("Collection.reverseOrder()和Collections.sort()使用后的列表:\n" + al);
}
}
输出
Collection.reverseOrder()和Collections.sort()使用后的列表:
[50,40,30,20,10]
注意: Geeks,现在您一定在想我们是否可以使用Arrays.sort()?
无法直接使用Arrays.sort()按降序排序原始数组。如果我们试图通过传递由Collections.reverseOrder()定义的反向比较器来调用Arrays.sort()方法,它将引发以下错误:
提示: 但这对“对象数组”(例如Integer数组)可以正常工作,但对原始数组(例如int数组)无效。
用例2: 对数组进行降序排序
示例
// Java程序展示了Collections类中reverseOrder()方法的工作方式
// 用于按降序排序数组
// 导入所需的实用类
import java.util.*;
// 主类
// CollectionSorting
public class GFG {
// 主方法
public static void main(String[] args)
{
// 创建要按降序排序的数组
Integer[] arr = { 30, 20, 40, 10 };
// Collections.sort方法按降序排序arr[]的元素
// 然后使用Arrays.sort()对数组进行排序
Arrays.sort(arr, Collections.reverseOrder());
// 在控制台上打印排序后的数组
System.out.println(
"Array after the use of Collection.reverseOrder()"
+ "and Arrays.sort() :\n"
+ Arrays.toString(arr));
}
}
输出
Array after the use of Collection.reverseOrder() and Arrays.sort() :
[40, 30, 20, 10]
情况3: 当存在用户定义的比较器进行反向操作时,按照学生的学号降序排列。
public static Comparator reverseOrder(Comparator c)
它返回一种比较器,强制实施传递的比较器对象的反向顺序。 我们可以使用此方法按照用户定义的比较器的逆序对列表进行排序。 例如,在下面的程序中,我们创建了用户定义比较器的反向顺序,以按照学生的学号降序排序。
示例:
// Java程序演示了
// reverseOrder(Comparator c)的使用方式
// 当使用用户定义的比较器进行排序并按卷号降序排列学生时
// 导入所需的类
import java.io.*;
import java.lang.*;
import java.util.*;
// 第1类
// 帮助类,表示一个学生
class Student {
int rollno;
String name, address;
// 构造函数
public Student(int rollno, String name, String address)
{
// This指当前实例本身
this.rollno = rollno;
this.name = name;
this.address = address;
}
// 学生类的方法
// 在main()方法中打印学生详细信息
public String toString()
{
return this.rollno + " " + this.name + " "
+ this.address;
}
}
// 第2类
// 实现接口的帮助类
class Sortbyroll implements Comparator<Student> {
// 方法
// 用于卷号升序排序
public int compare(Student a, Student b)
{
return a.rollno - b.rollno;
}
}
// 第3类
// 主类
class GFG {
// 主驱动程序
public static void main(String[] args)
{
// 创建一个空的ArrayList
ArrayList<Student> ar = new ArrayList<Student>();
// 使用add()方法添加在Student类中定义的自定义属性
ar.add(new Student(111, "bbbb", "london"));
ar.add(new Student(131, "aaaa", "nyc"));
ar.add(new Student(121, "cccc", "jaipur"));
// 显示消息以提高可读性
System.out.println("Unsorted");
// 打印学生列表
for (int i = 0; i < ar.size(); i++)
System.out.println(ar.get(i));
// 使用与Sortbyroll()相反的比较器按卷号降序排序学生列表
Comparator c
= Collections.reverseOrder(new Sortbyroll());
Collections.sort(ar, c);
// 显示消息以提高可读性
System.out.println("\nSorted by rollno");
// 按卷号降序打印已排序学生
for (int i = 0; i < ar.size(); i++)
System.out.println(ar.get(i));
}
}
输出:
Unsorted
111 bbbb london
131 aaaa nyc
121 cccc jaipur
Sorted by rollno
131 aaaa nyc
121 cccc jaipur
111 bbbb london
这里需要记住的关键是,上面的程序使用了未经检查和不安全的操作。