[英]How to sort a Collection of generic Pairs
这是家庭作业,因此我希望提供一些解释,而不仅仅是给我答案。
我有一个通用的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();
}
});
}
但这对我不起作用,我收到一条错误消息,指出sort方法不适用于那些参数。 我真的不知道从这里去哪里。
Collections.sort
仅适用于List
实例,不适用于常规Collections
。 例如,对HashSet
进行排序没有任何意义。
其次,由于算术溢出,应避免在类似的比较器中使用减法。 最好使用Integer.compare
。
同样,返回类型为Collection<Pair<?,?>>
必须返回某些内容。 您可以返回col
,但是在对col
进行突变时,使该方法void
更有意义。
另一点是,除非第二个类型参数为Integer
(我假设v()
返回类型为V
),否则您的方法似乎将抛出ClassCastException
。 在这种情况下,没有必要为Pair<?, ?>
编写方法,因为您可以只使用Pair<?, Integer>
。
最后,由于泛型在Java中的工作方式,您实际上将无法使用当前签名传递List<Pair<String, Integer>>
,因为List<Pair<String, Integer>>
不是 List<Pair<?, Integer>>
(请参阅此问题或该 问题 )。 如果要执行此操作,则参数应具有List<? extends Pair<?, Integer>>
类型List<? extends Pair<?, Integer>>
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 extends Comparable<? super K>
说K
S可与其它相比较K
秒。
不过,您仍然需要使用List
。 您可以使用接受Collection
的ArrayList
构造函数。
根据要求,我将由您自行编写正确的代码。
这是完整的程序:
public static <K extends Comparable<? super K>, V extends Comparable<? super V>> void sortPairCollection(List<Pair<K, V>> col){
Collections.sort(col, new Comparator<Pair<K,V>>(){
public int compare(Pair<K, V> o1, Pair<K, V> o2) {
int keyflag = o1.getValue().compareTo(o2.getValue()) == 0 ? o1.getKey().compareTo(o2.getKey()): o1.getValue().compareTo(o2.getValue()) ;
return keyflag;
}});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.