Panduan Menyusun di Kotlin

1. Gambaran keseluruhan

Kotlin membangun di atas kerangka Java Collection menggunakan kaedah peluasan. Ini secara dramatik meningkatkan kebolehgunaan dan kebolehbacaan tanpa memerlukan kebergantungan pihak ketiga seperti Apache Commons atau Jambu Batu.

Dalam tutorial ini, kita akan memfokus pada penyortiran di Kotlin. Juga, kami akan menggunakan pakej kotlin.comparisons untuk melaksanakan peraturan pesanan yang kompleks.

2. Menyusun Koleksi

Kotlin menyediakan pelbagai utiliti untuk memudahkan proses menyusun koleksi. Mari kita terokai beberapa kaedah ini.

2.1. Susun

Kaedah paling mudah untuk menyusun koleksi adalah dengan memanggil kaedah pengisihan . Kaedah ini akan menggunakan susunan semula jadi unsur-unsur. Juga, ia akan mengikut arah menaik secara lalai, jadi 'a' adalah sebelum 'b' dan '1' sebelum '2':

val sortedValues = mutableListOf(1, 2, 7, 6, 5, 6) sortedValues.sort() println(sortedValues)

Dan hasil kod di atas adalah:

[1, 2, 5, 6, 6, 7]

Penting untuk diperhatikan bahawa kami telah menggunakan koleksi yang boleh berubah. Sebabnya ialah bahawa yang jenis kaedah akan menyusun di-tempat . Sekiranya kita mahu hasilnya dikembalikan sebagai senarai baru, maka kita hanya perlu menggunakan kaedah yang disusun sebagai gantinya.

Selanjutnya, kita boleh menggunakan kaedah sortDescending atau reverse untuk menyusun mengikut urutan menurun .

2.2. Disusun mengikut

Sekiranya kita perlu menyusun mengikut sifat tertentu dari objek tertentu, kita dapat menggunakan sortBy. The sortBy kaedah membolehkan kita untuk lulus fungsi pemilih sebagai hujah. Fungsi pemilih akan menerima objek dan harus mengembalikan nilai yang ingin kami susun:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortBy { it.second } println(sortedValues)

Dan hasil kod di atas adalah:

[(1, a), (2, b), (7, c), (5, c), (6, d), (6, e)]

Sekali lagi, koleksi perlu diubah kerana kaedah sortBy akan disusun di tempat. Sekiranya kita mahu hasilnya dikembalikan sebagai senarai baru, maka kita perlu menggunakan kaedah sortedBy dan bukannya kaedah sortBy .

Seperti sebelumnya, untuk urutan menurun, kita boleh menggunakan kaedah sortByDescending atau terbalik .

2.3. Isih dengan

Untuk penggunaan yang lebih maju (untuk menggabungkan beberapa peraturan, misalnya), kita dapat menggunakan kaedah sortWith .

Kita boleh meneruskan objek Perbandingan sebagai hujah. Di Kotlin kita mempunyai banyak cara untuk membuat objek Perbandingan dan kita akan membahasnya di bahagian seterusnya:

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortWith(compareBy({it.second}, {it.first})) println(sortedValues)

Dan hasil kod di atas adalah bahawa mereka disusun mengikut huruf dan kemudian mengikut nombor:

[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]

Kerana sortWith akan melakukan penyortiran di tempat, kita perlu menggunakan koleksi yang dapat diubah. Sekiranya kita mahu hasilnya dikembalikan sebagai koleksi baru maka kita perlu menggunakan kaedah sortedWith dan bukannya kaedah sortWith .

Untuk urutan menurun, kita boleh menggunakan kaedah terbalik atau secara alternatif menentukan Pembanding yang betul .

3. Perbandingan

Kotlin mengandungi pakej yang sangat berguna untuk membina Comparator - kotlin.comparisons. Dalam bahagian berikut, kita akan membincangkan:

  • Penciptaan pembanding
  • Pengendalian nilai nol
  • Membalikkan pesanan
  • Comparator peraturan lanjutan

3.1. Penciptaan Perbandingan

Untuk mempermudah pembuatan Komparator kami , Kotlin membawa banyak kaedah kilang untuk menjadikan kod kami lebih ekspresif.

Kilang Pembanding termudah yang ada ialah naturalOrder () . Tidak ada argumen yang diperlukan dan pesanan naik secara lalai:

val ascComparator = naturalOrder()

Untuk objek dengan pelbagai sifat, kita boleh menggunakan kaedah membandingkanBy . Sebagai hujah, kami memberikan sejumlah fungsi yang berubah-ubah (aturan penyortiran) yang masing-masing akan mengembalikan objek yang dapat dibandingkan . Kemudian, fungsi-fungsi tersebut akan dipanggil secara berurutan sehingga objek Bandingan yang dihasilkan dinilai tidak sama atau sehingga semua fungsi dipanggil.

Dalam contoh seterusnya, ia . nilai pertama digunakan untuk perbandingan dan, hanya apabila nilainya sama, ia akan dipanggil untuk memutuskan hubungan:

val complexComparator = compareBy
    
     ({it.first}, {it.second})
    

Jangan ragu untuk meneroka kotlin.comparisons untuk menemui semua kilang yang ada.

3.2. Pengendalian Nilai batal

Kaedah mudah untuk meningkatkan Perbandingan kami dengan pengendalian nilai nol adalah dengan menggunakan kaedah nullsFirst atau nullsLast . Kaedah ini akan menyusun nilai nol di tempat pertama atau terakhir masing-masing:

val sortedValues = mutableListOf(1 to "a", 2 to null, 7 to "c", 6 to "d", 5 to "c", 6 to "e") sortedValues.sortWith(nullsLast(compareBy { it.second })) println(sortedValues)

Hasil kod di atas akan:

[(1, a), (7, c), (5, c), (6, d), (6, e), (2, null)]

Kita dapat melihat bahawa nilai terakhir dalam koleksi yang dihasilkan adalah nilai dengan nilai nol .

3.3. Membalikkan Pesanan

To reverse the order, we can use the reverseOrder method or the reversed method. The former method has no arguments and returns a descending order. The latter method can be applied on a Comparator object and it will return its reversed Comparator object.

To build a Comparator using descending natural order we can do:

reverseOrder()

3.4. Comparator Rules Extension

Comparator objects can be combined or extended with additional sorting rules via the then methods available in kotlin.comparable package.

Only when the first comparator evaluates to equal, the second comparator will then be used.

Senarai pelajar kami mengandungi umur dan nama untuk setiap individu. Kami mahu mereka diurutkan dari yang termuda hingga yang tertua dan, ketika mereka berumur sama, turun berdasarkan nama:

val students = mutableListOf(21 to "Helen", 21 to "Tom", 20 to "Jim") val ageComparator = compareBy
    
      {it.first} val ageAndNameComparator = ageComparator.thenByDescending {it.second} println(students.sortedWith(ageAndNameComparator))
    

Hasil kod di atas akan:

[(20, Jim), (21, Tom), (21, Helen)]

4. Kesimpulan

Dalam tutorial ringkas ini, kami melihat cara menggunakan kaedah sort , sortBy dan sortWith untuk menyusun koleksi di Kotlin.

Kemudian, kami juga menggunakan pakej kotlin.comparisons untuk membuat objek Comparator dan memperbaikinya dengan peraturan penyortiran tambahan.

Pelaksanaan semua contoh dan potongan ini boleh didapati di GitHub.