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();
假设我已经实现了一个 class 边,它有 4 个属性,所有属性都是 int 类型:from
to
quality
length
.
在我的程序中,我创建了一个 Edge[]
数组。
我想实现 2 个排序参数 -
其中之一将按 qualities
、
另一个会按照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();