Java类数据类型排序问题



假设我实现了一个类Edge,它有4个属性,所有属性的类型都是int:fromtoqualitylength

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

我想实现2个排序参数-

其中一个将按照qualities、的降序对Edge阵列进行排序

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

在我的代码的不同部分中,我将需要这两个订单。

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

我知道的唯一方法是对类数据类型数组进行排序,以在类Edge中实现compareTo(),但这只适用于一个参数(质量或长度,但不能同时适用)。

如何实现两个排序函数(2个compareTo()函数?)并决定在排序过程中调用哪一个?在C++中,我们可以制作许多比较函数,并简单地说明要执行的函数。如何在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();

在Java中,您可以创建两个实现Comparator的类,定义您的compare方法,每个类对应您想要的排序顺序。

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

如果您使用的是Java8,则可以将方法引用传递给Comparator.comparing,以基于getter方法构造Comparator

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

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

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

您希望通过实现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());

最新更新