比较器作为 class 构造函数的参数
Comparator as a parameter for the constructor of a class
我似乎无法在任何地方找到具体的操作方法。我正在编写一个 class,它将比较器作为 parameter/argument 用于 class 的构造函数。我想用它来订购列表中的项目。但是我不确定在新 class.
中如何处理比较器
- 我导入了
java.util.Comparator
- 在 class 声明中我说“
impements Comparator<T>
”
- 我写了 (
Comparator<T> c
) 作为 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++;
}
}
我收到的错误消息是:
- 找不到符号 - 方法 compareTo
我希望能够比较任意两个对象,而不仅仅是整数,这就是为什么我想将比较器作为参数的原因。
您的问题并不清楚,但您的代码段中唯一类似集合的构造是一个整数对象数组。因此,这里唯一需要排序的是那个数组。
你需要 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
}
// ...
我似乎无法在任何地方找到具体的操作方法。我正在编写一个 class,它将比较器作为 parameter/argument 用于 class 的构造函数。我想用它来订购列表中的项目。但是我不确定在新 class.
中如何处理比较器- 我导入了
java.util.Comparator
- 在 class 声明中我说“
impements Comparator<T>
” - 我写了 (
Comparator<T> c
) 作为 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++;
}
}
我收到的错误消息是:
- 找不到符号 - 方法 compareTo
我希望能够比较任意两个对象,而不仅仅是整数,这就是为什么我想将比较器作为参数的原因。
您的问题并不清楚,但您的代码段中唯一类似集合的构造是一个整数对象数组。因此,这里唯一需要排序的是那个数组。
你需要 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
}
// ...