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

时间:2015-04-09 19:10:14

标签: java arrays algorithm sorting comparable

假设我已经实现了一个具有4个属性的类Edge,所有属性都是int:from to quality length

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

我想实现2个排序参数 -

其中一个将按qualities

的降序对Edge数组进行排序

另一个将根据lengths的增加顺序进行排序。

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

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

我知道排序类数据类型数组以在类Edge中实现compareTo()的唯一方法,但这仅适用于一个参数(质量或长度,但不适用于两者)。

如何实现两个排序函数(2 compareTo()个函数?)并决定在排序过程中调用哪个函数?在C ++中,我们可以创建许多比较函数,并简单地说明要经历的函数。如何在Java中实现这一点?

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

3 个答案:

答案 0 :(得分:2)

您创建两个单独的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();

答案 1 :(得分:1)

在Java中,您可以创建两个实现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();

答案 2 :(得分:0)

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

不要将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());