使用集合对列表进行排序会导致错误
sorting a list using Collections causes errors
我有一个 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??
}
};
您的 DMatch class 必须实现 Comparable 接口,或者您必须使用可以比较您的 DMatch 对象的适当比较器调用 Collections.sort( ... )。
Class 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
}
}
您必须像这样实现自定义比较器(将 getYourValueToCompare()
更改为您的 getter):
Collections.sort(dMatchList, new Comparator<DMatch>() {
public int compare(DMatch a1, DMatch a2) {
return a1.getYourValueToCompare().compareTo(a2.getYourValueToCompare());
}
});
注意:记得为DMatch
class实现equals method,否则你将看不到任何排序!!
我有一个 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??
}
};
您的 DMatch class 必须实现 Comparable 接口,或者您必须使用可以比较您的 DMatch 对象的适当比较器调用 Collections.sort( ... )。
Class 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
}
}
您必须像这样实现自定义比较器(将 getYourValueToCompare()
更改为您的 getter):
Collections.sort(dMatchList, new Comparator<DMatch>() {
public int compare(DMatch a1, DMatch a2) {
return a1.getYourValueToCompare().compareTo(a2.getYourValueToCompare());
}
});
注意:记得为DMatch
class实现equals method,否则你将看不到任何排序!!