比较器作为 class 构造函数的参数

Comparator as a parameter for the constructor of a class

我似乎无法在任何地方找到具体的操作方法。我正在编写一个 class,它将比较器作为 parameter/argument 用于 class 的构造函数。我想用它来订购列表中的项目。但是我不确定在新 class.

中如何处理比较器

我从来没有这样使用过比较器——我把它用作内部 class 就是这样,所以我不确定如何使比较方法在这个 class 当我将比较器作为构造函数的参数时。

我所做的唯一事情就是上面的三个项目符号。每当我尝试用比较器做某事时,我都会收到一条错误消息。

构造函数的代码如下:

public class SortedList<T> implements Comparator<T>
    //value, position and array are instance variables
    //I am switching array to a List to deal with generics
    private int position;
    private Integer[] array;

    public SortedList(Comparator<T> c){
       this.position = 0;
       this.array = new Integer[25];
    }

    public void sort(Integer num){
       boolean valid = false;
       int i = 0;

       while(!valid && i < array.length-1){
          if(num.compareTo(array[i] > 0)){
            array[i+1] = array[i];
            array[i] = num;
          }else{
            i++;
       }
    }

我收到的错误消息是:

我希望能够比较任意两个对象,而不仅仅是整数,这就是为什么我想将比较器作为参数的原因。

您的问题并不清楚,但您的代码段中唯一类似集合的构造是一个整数对象数组。因此,这里唯一需要排序的是那个数组。

你需要 Comparator<Integer> 来排序,而不是 Comparator<T>

一旦你有了它,要对该数组进行排序,你需要做的就是..

Arrays.sort(array, c);

你的SortedList<T>class不能实现Comparator<T>接口,因为这个class不用于比较对象。但是,它将使用 给定的Comparator<T> 实例对其条目进行排序。这意味着 classes 和方法应具有以下定义:

public class SortedList<T> {
     // ...
}

class 不再实现 Comparator<T> 接口。

private T[] array;

array 字段应为 T[] 类型,因为此 SortedList<T> 对象用于 sort/hold T 类型的对象,而不是 [=23] =] 对象。

public SortedList(Comparator<T> c){
    // ...
    this.comparator = c;
}

没错。构造函数接收一个 Comparator<T> 实例。您应该将此引用存储到一个字段中,以便以后可以在 sort() 方法中使用它。

public void sort(){
    // ...
}

sort()方法的Integer参数没有任何意义,所以删除它。现在您可以在 sort() 方法中使用存储的 Comparator<T> 实例并调用其 compare() 方法来比较存储数组中的两个对象。代码片段可能如下所示:

// ...
if (this.comparator.compare(this.array[i], this.array[i+1])) {
    // it should be on the left
} else {
    // it should be on the right
}
// ...