假设我实现了一个类Edge,它有4个属性,所有属性的类型都是int:from
to
quality
length
。
在我的程序中,我创建了一个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());