繁体   English   中英

如何对通用对的集合进行排序

[英]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 您可以使用接受CollectionArrayList构造函数。

根据要求,我将由您自行编写正确的代码。

这是完整的程序:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM