Apakah ada idiom standar untuk membandingkan nomor versi? Saya tidak bisa begitu saja menggunakan String String compareTo karena saya belum tahu berapa jumlah maksimum rilis poin yang akan ada. Saya perlu membandingkan versi dan memiliki yang berikut ini berlaku:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Bill the Lizard
sumber
sumber
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Anda dapat membandingkan nomor dengan yang lain dan dengan demikian menemukan versi yang lebih baru. Selain itu Anda dapat memeriksa apakahversion
string cocok dengan beberapa pola tertentu ingin\\d+\\.\\d+\\.\\d
membuat hasilnya memiliki setidaknya 3 digit..
karakter dan membandingkan setiap elemen panjang. Setelah itu, masukkan semua elemen ke dalam satu string, lalu parse sebagai int dan kemudian bandingkan dengan versi lain yang telah dikonversi dengan cara yang samaJawaban:
Tokenisasi string dengan titik sebagai pembatas dan kemudian bandingkan terjemahan bilangan bulat berdampingan, mulai dari kiri.
sumber
Solusi lain untuk pos lama ini (bagi mereka yang mungkin membantu):
Edit:
@daiscog: Terima kasih atas komentar Anda, kode ini telah dikembangkan untuk platform Android dan seperti yang direkomendasikan oleh Google, metode "cocok" memeriksa seluruh string seperti Java yang menggunakan pola pengaturan. ( Dokumentasi Android - Dokumentasi JAVA )
sumber
Pattern.compile()
, mengingat logika Anda dipanggil denganO(N log N)
kompleksitas.Sangat mudah menggunakan Maven:
Anda bisa mendapatkan string ketergantungan yang tepat untuk Maven Artifact dari halaman ini :
sumber
Comparable.compareTo
didokumentasikan sebagai mengembalikan "bilangan bulat negatif, nol, atau bilangan bulat positif", jadi itu kebiasaan yang baik untuk menghindari memeriksa -1 dan +1.Anda perlu menormalkan string versi agar dapat dibandingkan. Sesuatu seperti
Cetakan
sumber
Yang terbaik untuk menggunakan kembali kode yang ada, ambil kelas ComparableVersion Maven
keuntungan:
Jangan sertakan ketergantungan pada artefak pakar karena hal itu akan menarik berbagai ketergantungan transitif
sumber
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Contoh:
Keluaran:
sumber
Bertanya-tanya mengapa semua orang menganggap bahwa versi hanya terdiri dari bilangan bulat - dalam kasus saya itu bukan.
Mengapa menciptakan kembali roda (dengan asumsi versi mengikuti standar Semver)
Pertama instal https://github.com/vdurmont/semver4j via Maven
Kemudian gunakan perpustakaan ini
sumber
sumber
Jika Anda sudah memiliki Jackson di proyek Anda, Anda dapat menggunakan
com.fasterxml.jackson.core.Version
:sumber
sumber
beberapa output:
sumber
Saya menulis Perpustakaan Open Source bernama MgntUtils yang memiliki utilitas yang berfungsi dengan versi String. Itu benar membandingkan mereka, bekerja dengan rentang versi dan sebagainya. Berikut ini adalah pustaka metode javadoc See
TextUtils.comapreVersions(...)
. Telah banyak digunakan dan diuji dengan baik. Berikut adalah artikel yang menjelaskan tentang perpustakaan dan di mana mendapatkannya. Ini tersedia sebagai artefak Maven dan pada github (dengan sumber dan JavaDoc)sumber
untuk proyek-proyek saya, saya menggunakan pustaka versi-milik umum saya https://github.com/raydac/commons-version yang berisi dua kelas tambahan - untuk mem-parsing versi (parsing versi dapat dibandingkan dengan objek versi lain karena ia sebanding) dan VersionValidator yang memungkinkan untuk memeriksa versi untuk beberapa ekspresi seperti
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
sumber
Saya membuat utilitas sederhana untuk membandingkan versi pada platform Android menggunakan konvensi Semantic Versioning . Jadi itu hanya berfungsi untuk string dalam format XYZ (Major.Minor.Patch) di mana X, Y, dan Z adalah bilangan bulat non-negatif. Anda dapat menemukannya di GitHub saya .
Metode Version.compareVersions (String v1, String v2) membandingkan dua string versi. Ini mengembalikan 0 jika versinya sama, 1 jika versi v1 sebelum versi v2, -1 jika versi v1 setelah versi v2, -2 jika format versi tidak valid.
sumber
sumber
@ Posting alex di Kotlin
pemakaian:
sumber
Menulis sedikit fungsi sendiri. Lebih Sederhana Menggunakan Daftar
sumber
Saya telah menulis perpustakaan kecil Java / Android untuk membandingkan nomor versi: https://github.com/G00fY2/version-compare
Apa yang pada dasarnya dilakukannya adalah ini:
Cuplikan ini tidak menawarkan pemeriksaan atau penanganan kesalahan. Selain itu perpustakaan saya juga mendukung sufiks seperti "1.2-rc"> "1.2-beta".
sumber
Menggunakan Java 8 Stream untuk mengganti nol terkemuka di komponen. Kode ini lulus semua tes di interviewbit.com
sumber
Karena tidak ada jawaban di halaman ini yang menangani teks campuran dengan baik, saya membuat versi saya sendiri:
Itu masih gagal pada kasus-kasus di mana Anda perlu membandingkan "alpha" dengan "beta" sekalipun.
sumber
Untuk seseorang yang akan menampilkan Alert Pembaruan Angkatan berdasarkan nomor versi saya punya Ide berikut. Ini dapat digunakan ketika membandingkan versi antara versi Aplikasi Android Saat Ini dan versi konfigurasi jarak jauh firebase. Ini bukan jawaban untuk pertanyaan yang diajukan tetapi ini akan membantu seseorang dengan pasti.
Anda dapat menjalankan kode ini dengan menyalin paste di https://www.onlinegdb.com/online_java_compiler
sumber
sumber
Saya melakukannya sekarang dan bertanya pada diri sendiri, apakah itu benar? Karena saya belum pernah menemukan solusi terbersih sebelumnya daripada solusi saya:
Anda hanya perlu membagi versi string ("1.0.0") seperti contoh ini:
Maka Anda akan memiliki: {"1", "0", "0"}
Sekarang, menggunakan metode yang saya lakukan:
Metode:
Menunggu umpan balik :)
sumber
berdasarkan https://stackoverflow.com/a/27891752/2642478
Anda dapat menggunakan seperti:
sumber
Kode ini mencoba menyelesaikan jenis versi perbandingan ini.
sumber
Saya menyukai ide dari @Peter Lawrey, dan saya memperluasnya ke batas lebih lanjut:
Semoga ini bisa membantu seseorang. Itu melewati semua kasus uji dalam interviewbit dan leetcode (perlu batalkan komentar dua baris dalam fungsi compareVersion).
Mudah diuji!
sumber
sumber
Inilah implementasi yang dioptimalkan:
Hasil:
sumber