Existe um idioma padrão para comparar números de versão? Não posso simplesmente usar um String compareTo direto porque ainda não sei qual será o número máximo de lançamentos de pontos. Preciso comparar as versões e manter o seguinte verdadeiro:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
java
comparison
versioning
Bill the Lizard
fonte
fonte
String version = "1.1.2".replace(".", "");
int number = Integer.parseInt(version); // = 112
. Você pode comparar o número com outro e, assim, encontrar a versão mais recente. Além disso, você pode verificar se aversion
sequência corresponde a um determinado padrão, como\\d+\\.\\d+\\.\\d
se o resultado tivesse pelo menos três dígitos..
caractere e comparando o comprimento de cada elemento. Depois basta colocar todos os elementos em uma corda, em seguida, analisá-lo como int e, em seguida, compará-la com a outra versão que foi convertido da mesma formaRespostas:
Tokenize as seqüências com o ponto como delimitador e compare a conversão de números inteiros lado a lado, começando pela esquerda.
fonte
Outra solução para este post antigo (para aqueles que podem ajudar):
Editar:
@daiscog: Obrigado por sua observação, este código foi desenvolvido para a plataforma Android e, conforme recomendado pelo Google, o método "corresponde" verifica toda a cadeia de caracteres, diferente do Java que usa um padrão regulatório. ( Documentação Android - documentação JAVA )
fonte
Pattern.compile()
, já que sua lógica é chamada comO(N log N)
complexidade.É realmente fácil usar o Maven:
Você pode obter a sequência de dependência correta para o Artefato do Maven nesta página :
fonte
Comparable.compareTo
está documentado como retornando "um número inteiro negativo, zero ou número inteiro positivo", portanto, é um bom hábito evitar a verificação de -1 e +1.Você precisa normalizar as seqüências de versão para que possam ser comparadas. Algo como
Impressões
fonte
Para melhor reutilizar o código existente, use a classe ComparableVersion do Maven
vantagens:
Não inclua dependência de artefato de maven, pois isso puxará várias dependências transitivas
fonte
assertTrue(new ComparableVersion("1.1-BETA").compareTo(new ComparableVersion("1.1-RC")) < 0)
Exemplo:
Resultado:
fonte
Querendo saber por que todo mundo assume que as versões são compostas apenas de números inteiros - no meu caso, não era.
Por que reinventar a roda (assumindo que a versão segue o padrão Semver)
Primeiro instale https://github.com/vdurmont/semver4j via Maven
Então use esta biblioteca
fonte
fonte
Se você já possui Jackson em seu projeto, pode usar
com.fasterxml.jackson.core.Version
:fonte
fonte
alguma saída:
fonte
Eu escrevi uma biblioteca de código-fonte aberto chamada MgntUtils que possui um utilitário que funciona com versões de String. Ele os compara corretamente, funciona com intervalos de versões e assim por diante. Aqui está esta biblioteca javadoc Veja métodos
TextUtils.comapreVersions(...)
. Foi muito utilizado e bem testado. Aqui está o artigo que descreve a biblioteca e onde obtê-la. Está disponível como artefato Maven e no github (com fontes e JavaDoc)fonte
para meus projetos, uso minha biblioteca de versão comum https://github.com/raydac/commons-version, que contém duas classes auxiliares - para analisar a versão (a versão analisada pode ser comparada com outro objeto de versão porque é comparável) e o VersionValidator que permite verificar a versão para alguma expressão como
!=ide-1.1.1,>idea-1.3.4-SNAPSHOT;<1.2.3
fonte
Criei um utilitário simples para comparar versões na plataforma Android usando a convenção de controle de versão semântica . Portanto, ele funciona apenas para cadeias de caracteres no formato XYZ (Major.Minor.Patch) em que X, Y e Z são números inteiros não negativos. Você pode encontrá-lo no meu GitHub .
O método Version.compareVersions (String v1, String v2) compara duas seqüências de versão. Retorna 0 se as versões forem iguais, 1 se a versão v1 for anterior à versão v2, -1 se a versão v1 for posterior à versão v2, -2 se o formato da versão for inválido.
fonte
fonte
publicação de @ alex no Kotlin
uso:
fonte
Eu mesmo escrevi uma pequena função.
fonte
Escrevi uma pequena biblioteca Java / Android para comparar números de versão: https://github.com/G00fY2/version-compare
O que basicamente faz é o seguinte:
Este fragmento não oferece nenhuma verificação ou tratamento de erros. Além disso, minha biblioteca também suporta sufixos como "1.2-rc"> "1.2-beta".
fonte
Usando o Java 8 Stream para substituir os zeros iniciais nos componentes. Este código passou em todos os testes em Interviewbit.com
fonte
Como nenhuma resposta nesta página lida bem com texto misto, criei minha própria versão:
Ainda é insuficiente nos casos em que você precisa comparar "alfa" com "beta".
fonte
Para alguém que mostrará o Force Update Alert com base no número da versão, tenho uma ideia a seguir. Isso pode ser usado ao comparar as versões entre a versão do Android Current App e a versão de configuração remota do firebase. Esta não é exatamente a resposta para a pergunta, mas isso definitivamente ajudará alguém.
Você pode executar esse código copiando e colando em https://www.onlinegdb.com/online_java_compiler
fonte
fonte
Eu fiz isso agora e me perguntei, está correto? Porque nunca encontrei uma solução mais limpa do que a minha:
Você só precisa dividir as versões das strings ("1.0.0") como este exemplo:
Então você terá: {"1", "0", "0"}
Agora, usando o método que eu fiz:
Método:
À espera de qualquer feedback :)
fonte
com base em https://stackoverflow.com/a/27891752/2642478
você pode usar como:
fonte
Este código tenta resolver esse tipo de versões de comparação.
fonte
Gostei da idéia de Peter Lawrey, e a ampliei para outros limites:
Espero que ajude alguém. Ele passou em todos os casos de teste no Interviewbit e no Leetcode (é necessário descomentar duas linhas na função compareVersion).
Facilmente testado!
fonte
fonte
Aqui está uma implementação otimizada:
Resultado:
fonte