1. ホーム
  2. ジャワ

実質的な解決策 比較方式は一般契約に違反する!?

2022-02-25 12:32:10

今日、あるプロジェクトで、時々ソートしてエラーを報告するものに遭遇しました。

List<Integer> collect = Arrays.asList( array ).stream().sort( (h1, h2) -> (h1).compareTo( h2 ) >= 0 ? 1 : -1 ).collect( Collectors.toList() );

JDK7でのソートメソッドの実装では、compareメソッドは2つの値が等しい場合に0を返す必要があり、そうでない場合はソート時にエラーを投げることがありますが、JDK6にはこの制限はありません。

ここで、Web上で公開されている解決策は 
3.ソリューション 
問題を解決する方法は少なくとも3つあります。

(1) JDKバージョン1.6で実行する。

(2) The ONE のソースコードを修正し、通過性を確保する

ルータのコンパレータComparatorを変更するだけです。例えば、MaxPropComparatorをMaxPropに変更します。

private class MaxPropComparator implements Comparator {... 
... 

(3) ソースコードの再コンパイル

JDK1.6+で適切に動作するように、The ONEソースコードを再コンパイルするためのオプションをいくつか追加します[1]。

方法1:main関数の1行目に以下のコードを追加します。

System.setProperty("java.util.Arrays.useLegacyMergeSort", "true") を設定します。 
方法2:オプション -Djava.util.Arrays.useLegacyMergeSort=true でコンパイルすると、完全なJavaコンパイルは次のようになります。

java -Djava.util.Arrays.useLegacyMergeSort=true -d64 -Xms512m -Xmx4g -cp . :lib/ECLA.jar:lib/DTNConsoleConnection.jar core.DTNSim $*.net

私の解決策 
1. compareメソッドがオーバーライドされた場合、greater than, less than, equal toを判断する必要があることもネットで紹介されています。
---------- -----

2. java の compareTo() メソッドを使用し、jdk に処理させる。

listRs = list.stream().sort((n1, n2) -> {
                    BigDecimal value1 = n1.getValue1();
                    BigDecimal value2 = n2.getValue1();
                    // reverse order, so multiply by -1
                    return -1 * value1.compareTo(value2);
        }).collect(Collectors.toList());

参考

https://blog.csdn.net/sinat_29970905/article/details/82385630