Java 尝试使用比较器时出错
我不知道我做错了什么,但当我尝试将Java 尝试使用比较器时出错,java,Java,我不知道我做错了什么,但当我尝试将公共最终比较器cmp初始化为一个值时,我得到了一个错误 public class FastGetListMM<K,V> extends AbstractListMM<K,V> { // Comparator used to sort elements; may be null if elements are Comparable public final Comparator<K> cmp;
公共最终比较器cmp
初始化为一个值时,我得到了一个错误
public class FastGetListMM<K,V> extends AbstractListMM<K,V> {
// Comparator used to sort elements; may be null if elements are Comparable
public final Comparator<K> cmp;
private List<K> keys;;
private List<V> values;
// Assume elements must be comparable
public FastGetListMM(ArrayList<K> keys, ArrayList<V> values)
{
super(keys, values);
//this.cmp = new Comparator<K>(); <<----error
}
// Use the given comparator to sort the keys
public FastGetListMM(Comparator<K> cmp)
{
super(cmp); <<-----error
//this.cmp = cmp; <<----error
}
公共类FastGetListMM扩展了AbstractListMM{
//用于对元素进行排序的比较器;如果元素具有可比性,则可能为空
公共最后比较国;
私有列表密钥;;
私有列表值;
//假设元素必须是可比较的
公共FastGetListMM(ArrayList键、ArrayList值)
{
超级(键、值);
//this.cmp=新比较器();通过以下方式:
this.cmp = new Comparator<K>();
this.cmp=新的比较器();
您尝试直接实例化,这是不允许的。您必须首先创建实现比较器的类,或实例化匿名类,如:
this.cmp = new Comparator<K>(){
@Override
public int compare(K k1, K k2) {
// compare k1 and k2 here
}
}
this.cmp=新比较器(){
@凌驾
公共整数比较(kk1,kk2){
//在这里比较k1和k2
}
}
或者指定一个lambda,如:
Comparator<K> cmp = (k1, k2) -> { /* compare k1 to k2 */ };
比较器cmp=(k1,k2)->{/*比较k1到k2*/};
如果您喜欢类,请使用以下习惯用法:
public static class MyComparator<K> implements Comparator<K> {
@Override
public int compare(K k1, K k2) {
// compare k1 to k2
}
}
公共静态类MyComparator实现Comparator{
@凌驾
公共整数比较(kk1,kk2){
//比较k1和k2
}
}
然后,在外部代码中实例化该类:
Comparator<K> cmp = new MyComparator<>();
Comparator cmp=new MyComparator();
通过以下方式:
this.cmp = new Comparator<K>();
this.cmp=新的比较器();
您尝试直接实例化,这是不允许的。您必须首先创建实现比较器的类,或实例化匿名类,如:
this.cmp = new Comparator<K>(){
@Override
public int compare(K k1, K k2) {
// compare k1 and k2 here
}
}
this.cmp=新比较器(){
@凌驾
公共整数比较(kk1,kk2){
//在这里比较k1和k2
}
}
或者指定一个lambda,如:
Comparator<K> cmp = (k1, k2) -> { /* compare k1 to k2 */ };
比较器cmp=(k1,k2)->{/*比较k1到k2*/};
如果您喜欢类,请使用以下习惯用法:
public static class MyComparator<K> implements Comparator<K> {
@Override
public int compare(K k1, K k2) {
// compare k1 to k2
}
}
公共静态类MyComparator实现Comparator{
@凌驾
公共整数比较(kk1,kk2){
//比较k1和k2
}
}
然后,在外部代码中实例化该类:
Comparator<K> cmp = new MyComparator<>();
Comparator cmp=new MyComparator();
您遇到了什么错误?您的AbstractListMM
类是否有比较器?comparator
是接口,您不能通过new
直接实例化它。或者您需要为它实例化匿名类。@Razib,不,它没有。@smcrohan无法实例化类型比较器
您遇到了什么错误获取?您的AbstractListMM
类是否有比较器?comparator
是接口,您不能通过new
直接实例化它。或者您需要为它实例化匿名类。@Razib,不,它没有。@smcrohan不能实例化类型比较器
@JonKcomparator
是接口;看@TNT,这就是我匆忙得到的!我要嘘嘘然后回家。我试过了,@SashaSalauyou,无论我尝试什么,我得到的都不能实例化类型比较器
。有什么我需要做的吗?我应该把实现比较器
放在类的名称中吗?lambda表达式将抛出一个错误,因为它不可用已知K
的类型是否实现java.lang.Compariable
。要使其工作MyComparator
必须是MyComparator@TNT举个例子,如果你比较hashcode(例如),K的类型可以是无界的。@JonKComparator
是一个接口;请看@TNT,这就是我匆忙得到的!我要嘘嘘然后回家。我试过了,@SashaSalauyou,我试过的任何东西,我得到的都不能实例化类型比较器
。我需要做什么吗?我应该把实现比较器
放在类的名称?lambda表达式将抛出错误,因为不知道K
的类型是否实现了java.lang.Compariable
。要使其工作,MyCompariator
必须是MyComparator@TNT举个例子,若你们比较hashcode(例如),K的类型可以是无界的。