Java - Class 数据类型 - 排序问题

Java - Class Data Type - Sorting Problems

假设我已经实现了一个 class 边,它有 4 个属性,所有属性都是 int 类型:from to quality length .

在我的程序中,我创建了一个 Edge[] 数组。

我想实现 2 个排序参数 -

其中之一将按 qualities

的降序对 Edge 数组进行排序

另一个会按照lengths的升序排序。

我将在我的代码的不同部分需要这两个顺序。

我将使用库函数 Arrays.sort() 进行排序。

我所知道的对 Class 数据类型数组进行排序以在 class 边缘内实现 compareTo() 的唯一方法,但这仅适用于一个参数(质量或长度,但不能同时适用于两者) .

如何实现两个排序函数(2 compareTo() 函数?)并决定在排序过程中调用哪一个?在 C++ 中,我们可以创建许多比较函数,只需将函数声明为 through.How 即可在 Java?

中实现此目的

注意:我的目标是使用 Arrays.sort() 对 DataType Edge 数组进行排序,并使用两个不同的参数进行排序并决定在哪个点使用哪个参数。

您创建了两个单独的 Comparator 实现来执行您描述的算法。然后你可以将适当的实例传递给 Collections.sort.

public class EdgeCompareLength implements Comparator<Edge>{
    @Override
    public int compare(Edge o1, Edge o2) {
        // your implementation here
        return 0;
    }
}

public class EdgeCompareProperties implements Comparator<Edge>{
    @Override
    public int compare(Edge o1, Edge o2) {
        // your implementation here
        return 0;
    }
}

所以你会在某个地方

List<Edge> edges = getEdges();

Collections.sort(edges,new EdgeCompareLength());
List<Edge> moreEdges = getMoreEdges();
Collections.sort(edges,new EdgeCompareProperties();

您想通过实施 Comparator<Edge> 来实施两种排序顺序(或至少其中一种)。然后,您通过接受 Comparator 作为第二个参数的 Arrays.sort() 版本进行排序。

不要将其与让 Edge 本身实现 Comparable 接口相混淆。 Comparator 实现将是不同的 类(来自 Edge 和彼此)。

示例:

public class DescendingByQuality implements Comparator<Edge> {
    public int compare(Edge e1, Edge e2) {
        if (e1.getQuality() < e2.getQuality()) return 1;
        if (e1.getQuality() > e2.getQuality()) return -1;
        return 0;
    }
}

...

Edge[] edges = ...;

Arrays.sort(edges, new DescendingByQuality());

在 Java 中,您可以创建 2 个实现 Comparator 的 类,定义您的 compare 方法,一个用于您想要的每个排序顺序。

然后您可以将其中一个 Comparator 的实例传递给 Arrays.sort

如果您正在使用 Java 8,您可以将方法引用传递给 Comparator.comparing 以基于 getter 方法构建 Comparator

Comparator<Edge> lengthAscEdgeComp = Comparator.comparing(Edge::getLength);

要进行降序排序,可以调用reversed

Comparator<Edge> qualityDescEdgeComp = Comparator.comparing(Edge::getQuality).reversed();