java - 使用 Comparable 比较通用变量

标签 java generics comparable

对于我类(class)中的一个作业,我们有一个名为 Pair 的类的集合,我们需要根据键的值按升序对其进行排序。

如果键是字符串或整数,我可以应用此方法,但如何编写代码来比较我的项目,当它们是通用的时,如下所示?

我类的教授解释了如何处理整数或字符串,但是当我的变量是通用的时,我完全不知所措。

以下是我的代码相关部分的副本。

import java.util.*;


public class Utils {

    public static<K extends Comparable<K>, V> Collection<Pair<K,V>> sortPairCollection(Collection <Pair<K,V>> col){
        ArrayList <Pair<K,V>> list = new ArrayList<>();
        //Code to compare

        return list;
    }

    public static void main(String[] args) {
        ArrayList <Pair<String,Integer>> list = new ArrayList<>();
        Pair<String, Integer> e = new Pair<>("One", 1);
        list.add(e);
        Pair<String, Integer> f = new Pair<>("Two", 2);
        list.add(f);

        Utils help = new Utils();
        help.sortPairCollection(list);
    }
}

这里的第二部分是我的 Pair 类的代码。 导入 java.io.Serialized; 导入java.util.Objects;

public class Pair <K,V> extends Object implements Serializable, Cloneable{


    public Pair(K k, V v){
       this.k = k;
       this.v = v;
    }


    public K k(){
       return k;
    }


    public V v(){
       return v;
    }


   /*
   ... //irrelevant data omitted
   */

   private final K k;
   private final V v;
}

最佳答案

选项 1.使用比较器

public class Cmp<K extends Comparable<K>, V> implements Comparator<Pair<K, V>> {
   @Override
   public int compare(Pair<K, V> o1, Pair<K, V> o2) {
      return o1.k.compareTo(o2.k);
   }
}

public class Utils {
    public static <K extends Comparable<K>, V> Collection<Pair<K, V>> sortPairCollection(
            Collection<Pair<K, V>> col) {
        ArrayList<Pair<K, V>> list = new ArrayList<>();
        Collections.sort(list, new Cmp<>());
        return list;
    }
}

选项 2。 实现可比较

public class Pair<K extends Comparable<K>, V> implements Comparable<Pair<K, V>> {
    private K k;
    private V v;
    @Override
    public int compareTo(Pair<K, V> o) {
        return k.compareTo(o.k);
    }
}
public class Utils {
    public static <K extends Comparable<K>, V> Collection<Pair<K, V>> sortPairCollection(Collection<Pair<K, V>> col) {
        ArrayList<Pair<K, V>> list = new ArrayList<>();
        Collections.sort(list);
        return list;
    }
}

或者只是

public class Utils {
    public static <K extends Comparable<K>, V> Collection<Pair<K, V>> sortPairCollection(Collection<Pair<K, V>> col) {
        ArrayList<Pair<K, V>> list = new ArrayList<>();
        Collections.sort(list, (p, o) -> p.k.compareTo(o.k));
        return list;
    }
}

顺便说一句,您不必为静态方法创建实例。只需调用

Utils.sortPairCollection(list);

关于java - 使用 Comparable 比较通用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53202231/

相关文章:

java - 如何将实例值从一个类传递到包含测试注释方法的另一个类

java - 远程 JVM(服务器)中的数据访问层(和数据库)如何与本地 JVM 中的 Web 应用程序通信?

c# - 属性中的通用类型类名

scala - 参数化类与函数

java - 如何对集合中的两个不同对象进行排序?

java - 从接口(interface)方法返回比较对象

Java 使用或覆盖已弃用的 API

java - 在struts2中迭代映射类型的问题

generics - 为什么我的 Realm Kotlin 泛型解决方法没有按预期工作?

java - 使用java中的Collections.sort()对列表中具有空值的多个字段进行排序?