Javaに含まれる数字で文字列をソートする

1. 前書き

このチュートリアルでは、英数字の__String__sに含まれる数字でソートする方法を見ていきます。 複数の__Strings ___を残っている数字でソートする前に、__ String ___から数字以外の文字をすべて削除することに焦点を当てます。
空の__String__sや無効な数字など、一般的なエッジケースを見ていきます。
最後に、ソリューションを単体テストして、期待どおりに機能することを確認します。

2. 問題の概要

開始する前に、コードで何を達成したいかを説明する必要があります。 この特定の問題について、次のことを想定します。
  1. 文字列には、数字のみ、文字のみ、または
    two.

  2. 文字列内の数値は、整数または倍精度の場合があります。

  3. 文字列内の数字が文字で区切られている場合、削除する必要があります
    文字と数字を一緒に凝縮します。 たとえば、 2d3 becomes 23.

  4. 簡単にするために、無効または欠落した番号が表示された場合、
    それらを0として扱います。

    これが確立されたら、ソリューションに取り掛かりましょう。

3. 正規表現ソリューション

最初のステップは入力__String内の数値パターンを検索することなので、___は正規表現として一般的に知られている正規表現を使用することができます。
最初に必要なのは正規表現です。 input _String_からの小数点だけでなく、すべての整数を保存します。 次の方法で目標を達成できます。
String DIGIT_AND_DECIMAL_REGEX = "[^\\d.]"

String digitsOnly = input.replaceAll(DIGIT_AND_DECIMAL_REGEX, "");
何が起こっているのか簡単に説明しましょう:
  1. _â€〜[^] ‘_– negは否定されたセットを表します。したがって、任意の文字をターゲットにします
    同封の正規表現で指定されていない

  2. _â€〜\ d’_–は任意の数字(0 – 9)に一致します

  3. _â€〜.’_–は、任意の“.â€文字に一致します

    次に、__ String.replaceAll __methodを使用して、正規表現で指定されていない文字を削除します。 これにより、目標の最初の3つのポイントを確実に達成できます。
    次に、空で無効な_Strings_が0を返し、valid _Strings_がvalid _Double_を返すようにするための条件を追加する必要があります。
if("".equals(digitsOnly)) return 0;

try {
    return Double.parseDouble(digitsOnly);
} catch (NumberFormatException nfe) {
    return 0;
}
これでロジックが完成しました。 あとは、コンパレータにプラグインするだけで、__ Lists __of input _Stringsを簡単にソートできます。 _
必要な場所からコンパレータを返す効率的なメソッドを作成しましょう。
public static Comparator<String> createNaturalOrderRegexComparator() {
    return Comparator.comparingDouble(NaturalOrderComparators::parseStringToNumber);
}

4. テスト、テスト、テスト

機能を検証するためのテストなしのコードは何が良いでしょうか? 簡単な単体テストをセットアップして、すべてが計画どおりに機能することを確認します。
List<String> testStrings =
  Arrays.asList("a1", "d2.2", "b3", "d2.3.3d", "c4", "d2.f4",); // 1, 2.2, 3, 0, 4, 2.4

testStrings.sort(NaturalOrderComparators.createNaturalOrderRegexComparator());

List<String> expected = Arrays.asList("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4");

assertEquals(expected, testStrings);
この単体テストでは、計画したすべてのシナリオをまとめました。 無効な数字、整数、小数、文字で区切られた数字はすべて、__testStrings __variableに含まれています。

5. 結論

この短い記事では、英数字の文字列をその中の数字に基づいてソートする方法を示しました。正規表現を使用して大変な作業をしています。
入力文字列の解析時に発生する可能性のある標準的な例外を処理し、ユニットテストでさまざまなシナリオをテストしました。
いつものように、コードhttps://github.com/eugenp/tutorials/tree/master/algorithms-sorting[GitHubで見つけることができます。]