这是家庭作业,所以我更喜欢一些解释,而不是仅仅给我答案。
我有一个通用的 Pair 类,它可以采用任何键值 K 和任何值 V。
目标是编写一个通用方法:
public static <...> Collection<Pair<...>> sortPairCollection(Collection <Pair<....>> col)
唯一的其他准则是 K 类型必须实现 Comparable<...>。
经过一番挖掘,我看到人们推荐了这样的东西:
public static Collection<Pair<?,?>> sortPairCollection(Collection<Pair<?,?>> col)
{
Collections.sort(col, new Comparator<Pair<?,?>>(){
@Override
public int compare(Pair<?, ?> x, Pair<?, ?> y) {
return (Integer)x.v() - (Integer)y.v();
}
});
}
但这对我不起作用,我收到一个错误,指出排序方法不适用于这些参数。我真的不知道该去哪里。
最佳答案
Collections.sort
仅适用于 List
实例,非一般Collections
。对 HashSet
进行排序是没有意义的例如。
其次,由于算术溢出,您应该避免在类似的比较器中使用减法。使用 Integer.compare
总是更好.
还有一个返回类型 Collection<Pair<?,?>>
的方法必须返回一些东西。您可以返回col
,但当你变异时col
使该方法更有意义 void
。
另一点是,您的方法看起来会抛出 ClassCastException
除非第二个类型参数是 Integer
(我假设 v()
的返回类型为 V
)。如果是这种情况,那么为 Pair<?, ?>
编写方法就没有意义了。因为你可以使用 Pair<?, Integer>
.
最后,由于 Java 中泛型的工作方式,您实际上无法传递 List<Pair<String, Integer>>
使用您当前的签名,因为 List<Pair<String, Integer>>
是不是 List<Pair<?, Integer>>
(参见 this question 或 this one )。如果您希望能够做到这一点,参数的类型应为 List<? extends Pair<?, Integer>>
.
编辑
我现在意识到我还没有真正回答这个问题。这个想法不是改变原始集合,而是返回一个新集合。此外,排序应该按键而不是值完成,因为 K
必须实现Comparable
.
为了使用compareTo
方法,需要注明K extends Comparable
。实现这一点的方法是使用签名
public static <K extends Comparable<? super K>, V> Collection<Pair<K, V>> sortPairCollection(Collection<Pair<K, V>> col)
这有点拗口——泛型显着增加了方法签名的复杂性。
K extends Comparable<? super K>
说K
s 可以与其他 K
进行比较s。
您仍然需要使用 List
尽管。您可以使用 ArrayList
接受 Collection
的构造函数。
根据要求,我将让您自行编写正确的代码。
关于java - 如何对通用对的集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36386868/