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

标签 java sorting

这是家庭作业,所以我更喜欢一些解释,而不是仅仅给我答案。

我有一个通用的 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 questionthis 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/

相关文章:

java - 用于 Mac 的简单 Java IDE?

javascript - JavaScript 快速排序中的无限递归?

java - 如何强制子类调用抽象实现的方法

sorting - 在groovy中按文件名对数组进行排序

java - 为什么该表将所有条目按字符串排序?

javascript - 如何对键为日期的对象数组进行排序

c++ - 按排序顺序将节点插入到链表中

java - 如何阻止 JBOSS AS7 将 http 管理控制台重定向到域

java - ListView 显示目录中的文件时出错

java - Mapreduce - 保留输入顺序