いくつかComparator
の s があります。1 つはDate
s、1 つは小数、もう 1 つはパーセンテージなどです。
最初は、10 進コンパレータは次のようになりました。
class NumericComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final Double i1 = Double.parseDouble(s1);
final Double i2 = Double.parseDouble(s2);
return i1.compareTo(i2);
}
}
人生はシンプルでした。もちろん、これは文字列が解析できない場合を処理しません。だから私は改善しましたcompare()
:
class NumericComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final Double i1;
final Double i2;
try {
i1 = Double.parseDouble(s1);
} catch (NumberFormatException e) {
try {
i2 = Double.parseDouble(s2);
} catch (NumberFormatException e2) {
return 0;
}
return -1;
}
try {
i2 = Double.parseDouble(s2);
} catch (NumberFormatException e) {
return 1;
}
return i1.compareTo(i2);
}
}
人生はより良くなりました。テストはより堅実に感じました。null
しかし、私のコード レビュー担当者は、「 s はどうですか?」と指摘しました。
すばらしいので、上記を繰り返すNullPointerException
か、メソッド本体の先頭に次を追加する必要があります。
if (s1 == null) {
if (s2 == null) {
return 0;
} else {
return -1;
}
} else if (s2 == null) {
return 1;
}
この方法は巨大です。最悪の部分は、異なるタイプの文字列を比較する他の 3 つのクラスでこのパターンを繰り返す必要があり、解析中に他の 3 つの例外が発生する可能性があることです。
私は Java の専門家ではありません。あえぎ-コピーして貼り付けるよりもクリーンできちんとした解決策はありますか? 文書化されている限り、複雑さの欠如と正確さを交換する必要がありますか?
更新:Comparator
値を処理するのは の仕事ではないことを示唆する人もいnull
ます。並べ替えの結果がユーザーに表示されるので、null を一貫して並べ替える必要があります。