![]()
devo confrontare 2 stringhe che rappresentano le versioni di un programma... come faccio a sapere quale è l'ultima ???
es.
1.4.1 > 1.3.10
![]()
![]()
DATEMI UN IDEA VI PREGO !!!!!![]()
![]()
![]()
devo confrontare 2 stringhe che rappresentano le versioni di un programma... come faccio a sapere quale è l'ultima ???
es.
1.4.1 > 1.3.10
![]()
![]()
DATEMI UN IDEA VI PREGO !!!!!![]()
![]()
odio chi parla di politica..
anzi vorrei fondare un partito contro tutto ciò
usi il metodo compareTo...
se il risultato è 0 sono uguali, se < 0 stringa precede anotherString, se > 0 al contrario...codice:stringa.compareTo(anotherString);
![]()
![]()
Chi di noi non vorrebbe
sollevare il velo sotto cui sta nascosto il
futuro...
David Hilbert
grandissimo !!!!!!!!!!!!!!!!!!!!!
ora faccio le prove...
odio chi parla di politica..
anzi vorrei fondare un partito contro tutto ciò
funziona !!!! GRAZIE 1000 mi hai risolto un bel problema...![]()
odio chi parla di politica..
anzi vorrei fondare un partito contro tutto ciò
e di che???![]()
![]()
![]()
![]()
Chi di noi non vorrebbe
sollevare il velo sotto cui sta nascosto il
futuro...
David Hilbert
bhe io farei una semplice valutazione numerica:
considera queste 2 opzioni:
- la versione rispetta sempre lo stesso pattern (es. 1.1.0, 1.1.4, 1.2.0 )?
-la versione non rispetta sempre lo stesso pattern (es. 1.1.0, 1.2.33, 1.3)
nel primo caso è sufficiente fare una replaceAll del carattere "punto" con stringa vuota, convertire in intero e vedere il maggiore.
nel secondo caso (più probabile) io direi di procedere così:
split delle stringhe per il carattere punto
es.
splittate diventano 2 array come di seguitocodice:a = "1.2.27" e b = "1.3.0"
poi, confronti le lunghezze degli array ed iteri SOLO fino alla lunghezza dell'array più corta, salvo un caso particolare che vedremo fra pococodice:String aa = a.split("\\."); String bb = b.split("\\.") aa[0]="1" aa[1]="2" aa[2]="27" bb[0]="1" bb[1]="3" bb[2]="0"
ora ti basta testare se uno dei 2 boolean è true, nel qual caso già sai quale è il maggiore.codice:int lunghezzaMinima = aa.length < bb.length ? aa.length : bb.length; boolean aaMaggioreDiBb = false boolean bbMaggioreDiAa = false for(int i=0; i < lunghezzaMinima; i++) { qui dentro confronti le versioni dal numero più significativo al meno significativo (ad ogni ciclo hai il numero meno significativo): int numAa = Integer.parseInt(aa[i]); int numBb = Integer.parseInt(bb[i]); ora il loop continua solo se i numeri sono uguali if(numAa > numBb) { aaMagioreDiBb = true; break; } else if(numBb > numAa) { bbMaggioreDiAa = true; break; } }
in caso fossero entrambi false, c'è ancora la famosa possibilità che abbiano lunghezze diverse, ti basterà quindi fare così:
a questo punto, se sono entrambe false le versioni sono uguali, altrimenti già lo saicodice:if(!aaMaggioreDiBb && !bbMaggioreDiAa) { aaMaggioreDiBb = (aa.length > bb.length); bbMaggioreDiAa = (bb.length > aa.length); }
p.s. occhio che non ci siano scritte tipo "alpha, beta, pre, rc ecc..."
Ci sono cose che non si possono sapere. Per tutto il resto c'è man
Prima di fare domande stupide: 1) googla 2) leggi le manpages 3) sparati.
Originariamente inviato da byaur
usi il metodo compareTo...
se il risultato è 0 sono uguali, se < 0 stringa precede anotherString, se > 0 al contrario...codice:stringa.compareTo(anotherString);
![]()
![]()
non credo sia giusto:
http://java.sun.com/j2se/1.4.2/docs/...html#compareTo(java.lang.String)
come da manuale, il compareTo confronta i valori unicode dei caratteri che compongono la stringa... quindi se uno ha 1.11.1 e 1.1.1.1 in realtà ti valuta il "punto" come carattere, che nell'indice unicode ha una sua posizione che non c'entra niente con i numeri di versione, quindi ti sballa il confronto
Ci sono cose che non si possono sapere. Per tutto il resto c'è man
Prima di fare domande stupide: 1) googla 2) leggi le manpages 3) sparati.
si infatti la soluzione per cui stavo optando era quella dello split..
ma la soluzione di byaur risparmia un bel po' di codice !!!![]()
odio chi parla di politica..
anzi vorrei fondare un partito contro tutto ciò
risparmi codice ma scrivi una cosa che non funziona.. se il tuo scopo è quelloOriginariamente inviato da morphy79
si infatti la soluzione per cui stavo optando era quella dello split..
ma la soluzione di byaur risparmia un bel po' di codice !!!![]()
![]()
la soluzione dello split è una delle 2 soluzioni possibili, si potrebbe fare anche con le regexp, scriveresti anche meno righe ma te le dovresti studiare prima...
fai una prova, guarda
codice:package test; public class GenericTest { public static void main(String[] args) { String v1 = "10.4.3.2"; String v2 = "1.4.3.22"; System.out.println("COMPARE = " + v1.compareTo(v2)); } }
ti restituirà 2, come se v2 fosse maggiore di v1
ed è sbagliato.
Ci sono cose che non si possono sapere. Per tutto il resto c'è man
Prima di fare domande stupide: 1) googla 2) leggi le manpages 3) sparati.
certo la soluzione con split è + completa sopratutto se il pattern delle 2 stringhe è diverso...io ho optato semplicemente per il compareTo perchè ho intuito che le stringhe di versione fossero sempre dello stesso pattern che so
XX.XX.XX dove X sono cifre... in questo caso compareTo funziona
cmq ti consiglio anche io split e valutazione numerica come ha detto stai_tranquillo
![]()
Chi di noi non vorrebbe
sollevare il velo sotto cui sta nascosto il
futuro...
David Hilbert