假设我已经实现了一个具有4个属性的类Edge,所有属性都是int:from
to
quality
length
。
在我的程序中,我创建了一个Edge[]
数组。
我想实现2个排序参数 -
其中一个将按qualities
,
另一个将根据lengths
的增加顺序进行排序。
我将在代码的不同部分需要这两个排序。
我将使用库函数Arrays.sort()
进行排序。
我知道排序类数据类型数组以在类Edge中实现compareTo()
的唯一方法,但这仅适用于一个参数(质量或长度,但不适用于两者)。
如何实现两个排序函数(2 compareTo()
个函数?)并决定在排序过程中调用哪个函数?在C ++中,我们可以创建许多比较函数,并简单地说明要经历的函数。如何在Java中实现这一点?
注意:我的目标是使用Arrays.sort()
对DataType Edge数组进行排序,并使用两个不同的参数进行排序,并使用DECIDE在哪一个时使用。
答案 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());