使用lambda表达式对一个包含对象的数组进行排序

4
我遇到了一个我不理解的问题。 在Table类中添加方法时,我想使用以下代码:
Arrays.binarySearch(asso, (a,b) -> a.cle.compareTo(b.cle));

我有一个包含键值对的Association对象数组,命名为asso。

当我使用String类型执行这段代码时,会出现一个错误“无法找到符号”,指的是compareTo(Object)方法。

以下是我的代码:

测试:

Table<String,String> table0 = new Table<String,String>(10);
table0.add("1","int");

方法:

import java.util.Arrays;

public class Table<C,V>{

  Association[] asso;

  public Table(int n){
    asso = new Association[n];
  }

  public void add(C cle, V valeur){
    asso[0] = new Association<C,V>(cle,valeur);
    Arrays.sort(asso, (a,b) -> a.cle.compareTo(b.cle));
  }

  public class Association<C,V>{

    public C cle;
    public V valeur;

    public Association(C cle,V valeur){
      this.cle = cle;
      this.valeur = valeur;
    }
  }
}

还有错误信息:

../src/Table.java:15: error: cannot find symbol
Arrays.sort(asso, (a,b) -> a.cle.compareTo(b.cle));
                                ^
symbol:   method compareTo(Object)
location: variable cle of type C
where C is a type-variable:
C extends Object declared in class Table.Association

感谢您的帮助。
1个回答

3
在泛型类型参数C上添加类型边界:
class Table<C extends Comparable<C>,V>

否则编译器不知道C类实现了Comparable接口(因此必须具有compareTo方法)。
同时,请勿使用数组的原始类型(Association[])。请使用:
Association<C,V>[] asso;

经过再次考虑,我建议您将Association类设置为static

public class Table<C extends Comparable<C>,V> {

    Association<C,V>[] asso;

    public Table(int n) {
        asso = new Association[n];
    }

    public void add(C cle, V valeur) {
        asso[0] = new Association<C,V>(cle,valeur);
        Arrays.sort(asso, (a,b) -> a.cle.compareTo(b.cle));
    }

    public static class Association<C,V> {

        public C cle;
        public V valeur;

        public Association(C cle,V valeur){
            this.cle = cle;
            this.valeur = valeur;
        }
    }
}

我已经完成了以下两个类的编写:class Association<C extends Comparable<C>,V>class Table<C extends Comparable<C>,V>但现在我遇到了以下错误:`Exception in thread "main" java.lang.NullPointerException at Table.lambda$ajout$0(Table.java:15) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.util.TimSort.sort(TimSort.java:220) at java.util.Arrays.sort(Arrays.java:1438) at Table.ajout(Table.java:15) at main.main(main.java:546)` - takesuma
@takesuma NullPointerException是一个独立的问题。您正试图对包含1个Association实例和9个空引用的数组进行排序。此外,您的add方法总是分配给数组的第一个索引,这是不正确的。 - Eran
@takesuma,你期望@NotNull做什么? - Eran
1
@takesuma 只需使用 Arrays.sort(asso, Comparator.nullsLast(Comparator.comparing (Association::getCle)));(并在 Association 类中添加一个 getter 方法 getCle())。 - Eran
我尝试过类似这样的代码: Arrays.binarySearch(asso, Comparator.nullsLast(Comparator.comparing (Association::getCle))) - takesuma
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接