0

タイプ MatOfDMAtch のオブジェクトがあり、リストに変換し、コレクションを使用して以下に示すように並べ替えたいのですが、コードを実行すると以下のエラーが発生します。

これらのエラーが表示される理由と解決方法を教えてください。

コード:

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??
    }
};
4

3 に答える 3

1

次のようなカスタム Comparator を実装する必要があります ( getYourValueToCompare()getter で変更します)。

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

注:クラスに equals メソッドを実装することを忘れDMatchないでください。そうしないと、並べ替えが表示されません!!

于 2015-03-30T11:02:02.423 に答える
1

DMatch クラスで Comparable インターフェイスを実装するか、DMatch オブジェクトを比較できる適切な Comparator を使用して Collections.sort( ... ) を呼び出す必要があります。

于 2015-03-30T11:00:55.137 に答える
0

クラス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
    }
} 
于 2015-03-30T11:01:02.927 に答える