【问题标题】:sorting a list using Collections causes errors使用 Collections 对列表进行排序会导致错误
【发布时间】:2015-03-30 10:58:29
【问题描述】:

我有一个 MatOfDMAtch 类型的对象,我转换为一个列表,我想使用 Collections 对其进行排序,如下所示,但是当我运行代码时,我收到以下错误。

请告诉我为什么会收到这些错误以及如何解决。

代码

List dMatchList = matDMatch.toList();
    System.out.println("dMatchList.size(): " + dMatchList.size());

    sortMAtches(0, 100, dMatchList);
}

private static void sortMAtches(double minDist, double maxDist, List list) {
    // TODO Auto-generated method stub
    java.util.Collections.sort(list);
    /*for (int i = 0; i < list.size(); i++) {
        System.out.println("lsit[" + i + "] = " + list.get(i));
    }*/
}

错误

Exception in thread "main" java.lang.ClassCastException: org.opencv.features2d.DMatch cannot be cast to java.lang.Comparable
at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Arrays$ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at test.FeaturesMatch.sortMAtches(FeaturesMatch.java:96)
at test.FeaturesMatch.main(FeaturesMatch.java:91)

更新

现在我使用了比较器接口,但正如您在下面注释行的代码中看到的,我不能使用 .compareTo() 方法! 怎么用?

List<DMatch> dMatchList = matDMatch.toList();
    DMatch[] dMatArray = matDMatch.toArray();
    System.out.println("dMatchArray.length(): " + dMatArray.length);
    System.out.println("dMatchList.size(): " + dMatchList.size());

    java.util.Collections.sort(dMatchList, compa);
}

static Comparator<DMatch> compa = new Comparator<DMatch>() {

    public int compare(DMatch arg0, DMatch arg1) {
        // TODO Auto-generated method stub
        return arg0.distance.???; //compareTo() does not exist??
    }
};

【问题讨论】:

    标签: java arraylist collections lis


    【解决方案1】:

    您必须像这样实现自定义比较器(通过您的 getter 更改 getYourValueToCompare()):

    Collections.sort(dMatchList, new Comparator<DMatch>() {
        public int compare(DMatch a1, DMatch a2) {
            return a1.getYourValueToCompare().compareTo(a2.getYourValueToCompare());
        }
    });
    

    注意:记得为DMatch类实现equals method,否则你将看不到任何排序!!

    【讨论】:

    • 按照我的说明并实现内部比较器,您将毫无问题地获得 compareTo 方法,还 记住在 DMatch 类中创建 EQUALS 方法
    【解决方案2】:

    您的 DMatch 类必须实现 Comparable 接口,或者您必须使用可以比较您的 DMatch 对象的适当 Comparator 调用 Collections.sort( ... )。

    【讨论】:

      【解决方案3】:

      org.opencv.features2d.DMatch 不实现接口java.lang.Comparable。所以默认情况下是不可比较的。你必须自己写Comparator

      并致电java.util.Collections.sort(list, new MyDMatchComparator());

      public class MyDMatchComparator implements Comparator<DMatch>{
      
          @Override
          public int compare(DMatcho1, DMatch o2) {
             //compare logic
          }
      } 
      

      【讨论】:

      • @user2121 这就是为什么您的课程不实施 Comparable。您必须以自己的方式实现它,例如:if (arg0.distance ==arg0.distance) return 0; if (arg0.distance ==arg0.distance) return -1 或您的逻辑。
      猜你喜欢
      • 2019-08-01
      • 2021-08-14
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2017-09-21
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多