Czy istnieje standardowy idiom do porównywania numerów wersji? Nie mogę po prostu użyć prostego porównania StringTo, ponieważ nie wiem jeszcze, jaka będzie maksymalna liczba wydań punktowych. Muszę porównać wersje i upewnić się, że są prawdziwe:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Bill the Lizard
źródło
źródło
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Możesz porównać numer z innym, a tym samym znaleźć nowszą wersję. Dodatkowo możesz sprawdzić, czyversion
ciąg pasuje do jakiegoś określonego wzorca,\\d+\\.\\d+\\.\\d
aby wynik miał co najmniej 3 cyfry..
znak i porównując długość każdego elementu. Następnie po prostu umieść wszystkie elementy w jednym ciągu, a następnie przeanalizuj go jako int, a następnie porównaj z inną wersją, która została przekonwertowana w ten sam sposóbOdpowiedzi:
Tokenizuj ciągi z kropką jako separatorem, a następnie porównaj tłumaczenia liczb całkowitych obok siebie, zaczynając od lewej strony.
źródło
Inne rozwiązanie dla tego starego postu (dla tych, którym może pomóc):
Edytować:
@daiscog: Dziękuję za uwagę, ten fragment kodu został opracowany dla platformy Android i zgodnie z zaleceniami Google metoda „dopasowuje” sprawdza cały ciąg, w przeciwieństwie do Javy, która używa wzorca regulacyjnego. ( Dokumentacja systemu Android - Dokumentacja JAVA )
źródło
Pattern.compile()
, biorąc pod uwagę, że twoja logika jest wywoływana zeO(N log N)
złożonością.Używanie Mavena jest naprawdę łatwe:
Możesz pobrać odpowiedni ciąg zależności dla artefaktu Mavena z tej strony :
źródło
Comparable.compareTo
jest to udokumentowane jako zwracanie „ujemnej liczby całkowitej, zera lub dodatniej liczby całkowitej”, więc dobrym zwyczajem jest unikanie sprawdzania wartości -1 i +1.Musisz znormalizować ciągi wersji, aby można je było porównać. Coś jak
Wydruki
źródło
Najlepiej ponownie wykorzystać istniejący kod, weź klasę ComparableVersion Mavena
Zalety:
Nie dołączaj zależności do artefaktu maven, ponieważ spowoduje to przyciągnięcie różnych zależności przechodnich
źródło
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Przykład:
Wynik:
źródło
Zastanawiam się, dlaczego wszyscy zakładają, że wersje składają się tylko z liczb całkowitych - w moim przypadku tak nie było.
Po co wymyślać koło na nowo (zakładając, że wersja jest zgodna ze standardem Semver)
Najpierw zainstaluj https://github.com/vdurmont/semver4j przez Maven
Następnie skorzystaj z tej biblioteki
źródło
źródło
Jeśli masz już Jacksona w swoim projekcie, możesz użyć
com.fasterxml.jackson.core.Version
:źródło
źródło
jakieś wyjście:
źródło
Napisałem bibliotekę Open Source o nazwie MgntUtils, która ma narzędzie, które działa z wersjami String. Porównuje je poprawnie, działa z zakresami wersji i tak dalej. Oto ta biblioteka javadoc Zobacz metody
TextUtils.comapreVersions(...)
. Był intensywnie używany i dobrze przetestowany. Oto artykuł opisujący bibliotekę i skąd ją wziąć. Jest dostępny jako artefakt Mavena i na githubie (ze źródłami i JavaDoc)źródło
do moich projektów używam mojej biblioteki commons-version https://github.com/raydac/commons-version zawiera dwie klasy pomocnicze - do parsowania wersji (parsowaną wersję można porównać z innym obiektem wersji, ponieważ jest porównywalna) i VersionValidator co pozwala sprawdzić wersję dla jakiegoś wyrażenia, takiego jak
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
źródło
Stworzyłem proste narzędzie do porównywania wersji na platformie Android przy użyciu konwencji Semantic Versioning . Więc działa tylko dla łańcuchów w formacie XYZ (Major.Minor.Patch), gdzie X, Y i Z są nieujemnymi liczbami całkowitymi. Możesz go znaleźć na moim GitHubie .
Metoda Version.compareVersions (String v1, String v2) porównuje dwa ciągi wersji. Zwraca 0, jeśli wersje są równe, 1, jeśli wersja v1 jest przed wersją v2, -1, jeśli wersja v1 jest po wersji v2, -2, jeśli format wersji jest nieprawidłowy.
źródło
źródło
Sam napisałem małą funkcję. Prostsze używanie list
źródło
Napisałem małą bibliotekę Java / Android do porównywania numerów wersji: https://github.com/G00fY2/version-compare
Zasadniczo robi to:
Ten fragment nie oferuje żadnych funkcji sprawdzania ani obsługi błędów. Poza tym moja biblioteka obsługuje również sufiksy, takie jak „1.2-rc”> „1.2-beta”.
źródło
Używanie strumienia Java 8 do zastępowania wiodących zer w komponentach. Ten kod przeszedł wszystkie testy w serwisie wywiadbit.com
źródło
Ponieważ żadna odpowiedź na tej stronie nie obsługuje dobrze tekstu mieszanego, stworzyłem własną wersję:
Wciąż jednak nie sprawdza się w przypadkach, w których trzeba porównać „alfa” z „beta”.
źródło
Dla kogoś, kto ma wyświetlać alert Force Update na podstawie numeru wersji, mam następujący pomysł. Można tego użyć podczas porównywania wersji między bieżącą wersją aplikacji na Androida a wersją zdalnej konfiguracji Firebase. To nie jest dokładnie odpowiedź na zadane pytanie, ale to zdecydowanie komuś pomoże.
Możesz uruchomić ten kod, kopiując wklejanie w https://www.onlinegdb.com/online_java_compiler
źródło
źródło
Zrobiłem to teraz i zadałem sobie pytanie, czy to prawda? Ponieważ nigdy wcześniej nie znalazłem najczystszego rozwiązania niż moje:
Wystarczy podzielić wersje ciągów („1.0.0”), jak w tym przykładzie:
Wtedy będziesz mieć: {"1", "0", "0"}
Teraz, używając metody, którą zrobiłem:
Metoda:
Czekam na wszelkie uwagi :)
źródło
Post @ alex w Kotlinie
stosowanie:
źródło
na podstawie https://stackoverflow.com/a/27891752/2642478
możesz użyć jak:
źródło
Ten kod próbuje rozwiązać ten typ wersji porównawczych.
źródło
Podobał mi się pomysł od @Peter Lawrey i rozszerzyłem go na dalsze ograniczenia:
Mam nadzieję, że to komuś pomoże. Przeszedł pomyślnie wszystkie przypadki testowe w kodzie wywiadu i kodzie (trzeba odkomentować dwie linie w funkcji compareVersion).
Łatwo przetestowane!
źródło
źródło
Oto zoptymalizowana implementacja:
Wynik:
źródło