Menyortir String berdasarkan Nomor yang Ada di Jawa

1. Perkenalan

Dalam tutorial ini, kita akan melihat bagaimana mengurutkan String alfanumerik berdasarkan angka yang dikandungnya. Kami akan fokus untuk menghapus semua karakter non-numerik dari String sebelum menyortir beberapa String dengan karakter numerik yang tersisa.

Kami akan melihat kasus tepi umum, termasuk String kosong dan nomor tidak valid.

Terakhir, kami akan menguji solusi kami untuk memastikannya berfungsi seperti yang diharapkan.

2. Menguraikan Masalah

Sebelum kita mulai, kita perlu menjelaskan apa yang kita ingin kode kita capai. Untuk masalah khusus ini, kami akan membuat asumsi berikut:

  1. String kami mungkin hanya berisi angka, hanya huruf atau campuran keduanya.
  2. Angka-angka dalam string kami mungkin bilangan bulat atau ganda.
  3. Ketika angka dalam string dipisahkan oleh huruf, kita harus menghilangkan huruf tersebut dan menyatukan digitnya. Misalnya, 2d3 menjadi 23.
  4. Untuk mempermudah, ketika nomor yang tidak valid atau hilang muncul, kita harus memperlakukannya sebagai 0.

Dengan ini didirikan, mari kita terjebak dalam solusi kita.

3. Solusi Regex

Karena langkah pertama kita adalah mencari pola numerik dalam String input kita , kita dapat menggunakan ekspresi reguler, umumnya dikenal sebagai regex.

Hal pertama yang kita butuhkan adalah regex kita. Kami ingin menyimpan semua bilangan bulat serta titik desimal dari input String . Kami dapat mencapai tujuan kami dengan yang berikut:

String DIGIT_AND_DECIMAL_REGEX = "[^\\d.]" String digitsOnly = input.replaceAll(DIGIT_AND_DECIMAL_REGEX, "");

Mari kita jelaskan secara singkat apa yang terjadi:

  1. '[^]' - menunjukkan himpunan yang dinegasikan, oleh karena itu menargetkan karakter apa pun yang tidak ditentukan oleh regex terlampir
  2. '\ d' - cocok dengan karakter digit apa pun (0 - 9)
  3. '.' - cocok dengan "." karakter

Kami kemudian menggunakan metode String.replaceAll untuk menghapus karakter apa pun yang tidak ditentukan oleh regex kami. Dengan melakukan ini, kami dapat memastikan bahwa tiga poin pertama dari tujuan kami dapat tercapai.

Selanjutnya, kita perlu menambahkan beberapa kondisi untuk memastikan String yang kosong dan tidak valid mengembalikan 0, sedangkan Strings yang valid mengembalikan Double yang valid :

if("".equals(digitsOnly)) return 0; try { return Double.parseDouble(digitsOnly); } catch (NumberFormatException nfe) { return 0; }

Itu melengkapi logika kita. Yang tersisa untuk dilakukan adalah menyambungkannya ke komparator sehingga kita dapat dengan mudah mengurutkan Daftar string input .

Mari buat metode yang efisien untuk mengembalikan komparator kita dari manapun kita menginginkannya:

public static Comparator createNaturalOrderRegexComparator() { return Comparator.comparingDouble(NaturalOrderComparators::parseStringToNumber); }

4. Uji, Uji, Uji

Apa gunanya kode tanpa tes untuk memverifikasi fungsinya? Mari siapkan pengujian unit cepat untuk memastikan semuanya berfungsi seperti yang kita rencanakan:

List 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 expected = Arrays.asList("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4"); assertEquals(expected, testStrings);

Dalam pengujian unit ini, kami telah mengemas semua skenario yang telah kami rencanakan. Angka yang tidak valid, bilangan bulat, desimal, dan angka yang dipisahkan huruf semuanya termasuk dalam variabel testStrings kami .

5. Kesimpulan

Dalam artikel singkat ini, kami telah mendemonstrasikan cara mengurutkan string alfanumerik berdasarkan angka di dalamnya - menggunakan ekspresi reguler untuk melakukan kerja keras bagi kami.

Kami telah menangani pengecualian standar yang mungkin terjadi saat mengurai string input dan menguji berbagai skenario dengan pengujian unit.

Seperti biasa, kode dapat ditemukan di GitHub.