使用 Comparable 比较泛型变量

Using Comparable to compare generic variables

对于我的 class 中的一个家庭作业,我们有一个 collection 的 class 标题对,我们需要根据关键。

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

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

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

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 class 的代码。 导入 java.io.Serializable; 导入 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.Use一个比较器

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);
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<>(col);
    //Code to compare
    list.sort(Comparator.comparing(Pair::k)); //this is the only change needed
    return list;
}

public static void main(String[] args) {
    List<Pair<String, Integer>> listas = Arrays.asList(
        new Pair<>("One", 1),
        new Pair<>("Two", 2));
    System.out.println(Utils.sortPairCollection(listas));

}

我们在这里所做的是,我们从 Pair 中提取了一个已经 Camparable 的密钥,并将其传递给 Comparator class 静态方法,该方法将生成自定义Comparator 为我们 Pair class。 请参阅 Comaparator here

的 Javadoc

如果你像我一样是一个干净优雅的代码爱好者,那么你可以使用 lambda 表达式的强大功能,当场创建一个匿名函数(没有名字的函数)来处理比较逻辑。从技术上讲,它与使用 ComparableComparator 函数式接口时相同,但使用 lambda 时,您不必通过仅为一个函数创建 类 来编写样板代码。相反,您以 lambda 表达式的形式当场创建该函数,java 处理其余部分。 Lambda 表达式是在 Java 8.

中引入的

Lambda 表达式的形式为 ( <parameters> ) -> { //body of the function }

public class Pair<K ,V extends Comparable<V>> {
private K k;
private V v;
public Pair(K k, V v){
   this.k = k;
   this.v = v;
}
public K k(){
   return k;
}
public V v(){
   return v;
}
}


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);

        // Second argument to this sort function is a lambda expression
        Collections.sort( list , (pair1 , pair2)->{

            return pair1.v().compareTo(pair2.v());

        });
    }
}

pair1pair2 的数据类型将为 Pair 这里有一些关于 lambda 表达式和功能接口的入门链接

函数接口:https://www.geeksforgeeks.org/functional-interfaces-java/

Lambda 表达式:https://www.geeksforgeeks.org/lambda-expressions-java-8/