📅  最后修改于: 2023-12-03 15:06:52.400000             🧑  作者: Mango
在Java中,我们可以使用Pair
类和Comparator
接口来对数组进行排序。Pair
类表示一对有序的对象,而Comparator
接口则定义了一种比较两个对象的方法。通过组合使用这两个元素,我们可以对含有任何类型元素的数组进行排序。
在Java中,Pair
类通常不是内置类。为使用它,我们需要先自定义一个Pair
类。
public class Pair<L, R> {
private final L left;
private final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() { return left; }
public R getRight() { return right; }
// 如果两个Pair等价,则它们的hashcode也应该相等
@Override
public int hashCode() {
return left.hashCode() ^ right.hashCode();
}
// 判断两个Pair是否相等
@Override
public boolean equals(Object o) {
if (!(o instanceof Pair)) return false;
Pair<?, ?> pairo = (Pair<?, ?>) o;
return this.left.equals(pairo.getLeft()) &&
this.right.equals(pairo.getRight());
}
}
上述代码定义了一个泛型类Pair
,其构造函数接收一个左值和一个右值,而getLeft()
和getRight()
方法则分别返回左值和右值。为了在hashCode()
和equals()
方法间建立一致性,我们将两个域分别的hashcode进行异或运算,再分别比较左右值。
Comparator
接口包含一个compare()
方法,用于比较Object
对象。它通常作为参数传入Collections.sort()
方法中,用于按照自定义的顺序对列表进行排序。
public static <T> void sort(List<T> list, Comparator<? super T> c)
参数:
list
:要排序的列表c
:定义全序关系的比较器。如果c
为null
,则使用元素的自然顺序。返回值:
该方法不返回任何值,但修改了传入的列表。
下面是一个例子,展示如何使用Pair
和Comparator
来对一个含有元素为Pair<Integer, String>
类型的数组进行排序。这个例子按照Integer
为首要条件升序排列,按照String
为次要条件逆序排列。
import java.util.Arrays;
import java.util.Comparator;
public class SortExample {
public static void main(String[] args) {
Pair<Integer, String>[] arr = new Pair[]{
new Pair<>(1, "b"),
new Pair<>(3, "a"),
new Pair<>(2, "c")
};
Arrays.sort(arr, new Comparator<>() {
@Override
public int compare(Pair<Integer, String> p1, Pair<Integer, String> p2) {
int cmp = p1.getLeft().compareTo(p2.getLeft());
if (cmp != 0) {
return cmp;
} else {
return p2.getRight().compareTo(p1.getRight());
}
}
});
for (Pair<Integer, String> p : arr) {
System.out.printf("(%d, %s) ", p.getLeft(), p.getRight());
}
}
}
// 输出:(1, b) (2, c) (3, a)
上面的代码中,compare()
方法首先比较两个Pair
对象的左值,如果左值不同,则返回它们之间的升序差。否则,我们根据右值的逆序来比较两个Pair
对象。最后,我们调用Arrays.sort()
方法来对数组进行排序,并使用匿名内部类来实现比较器接口。
这个程序将数组按照首要条件升序排列,按照次要条件逆序排列。其中,首要条件指的是Integer
型的左值,次要条件指的是String
型的右值。
在Java中,我们可以使用Pair
类和Comparator
接口来对数组进行排序。这种方法很灵活,可以处理各种类型的数据,且方便实用。定制化排序时,只需在调用排序方法时传入自定义的比较器,即可按照指定的标准进行排序。