2015-09-17 18 views
7

Ciao, ho una lista di stringhe come input con gli zeri iniziali e mi chiedo come ordinarli.Come ordinare i numeri con zeri iniziali in Java?

input (non ordinato)

0-2 
0-1 
1 
1-2 
1-0 
1-1 
4-3 

uscita (ordinate)

0-1 
0-2 
1 
1-0 
1-1 
1-2 
4-3 

posso rimuovere "-" e zeri, ma poi 0-1 -> 1 e 1 -> 1 sono gli stessi e non ci riesce essere ordinato. Altra cosa che mi viene in mente è quello di rimuovere lo zero e in questi numeri che non hanno uno zero a mettere 0 dietro in modo

0-1->1 
1->10 
10->100 

quindi utilizzare Java sorta ei numeri nuovo nella posizione di partenza, ma ordinato?

Edit:

  • Struttura è illimitata in profondità in modo 1-2-3-4-5-6 ...
  • posso avere un solo leader 0
  • Solo trattino (-) e il punto (.) sono i decimetri consentiti.
+1

È il caso che hai sempre un solo trattino? O la struttura diventa più complessa? – ojblass

+0

Quanti livelli hai? Max. 2? Illimitato? – Puce

+2

Cosa hai provato? - Hai controllato se l'ordinamento naturale delle stringhe fa quello che ti serve? – JimmyB

risposta

8

mi piacerebbe dividere la stringa dal carattere - e poi convertire ogni parte a un int:

public class StringPartsComparator implements Comparator<String> { 

    @Override 
    public int compare (String s1, String s2) { 
     String[] arr1 = s1.split("-"); 
     int len1 = arr1.length; 

     String[] arr2 = s2.split("-"); 
     int len2 = arr2.length; 

     int commonLength = Math.min(len1, len2); 

     // Go over the "common" elements. 
     // Return if any element differs from its counterpart 
     for (int i = 0; i < commonLength; ++i) { 
      int int1 = Integer.parseInt(arr1[i]); 
      int int2 = Integer.parseInt(arr2[i]); 
      int comp = Integer.compare(int1, int2); 
      if (comp != 0) { 
       return comp; 
      } 
     } 

     // All the common elements are equal, 
     // the longer string should be considered "bigger" 
     return Integer.compare(len1, len2); 
    } 
} 

Ora, basta usare questo comparatore personalizzato per ordinare le stringhe:

List<String> myList = ...; 
Collections.sort(myList, new StringPartsComparator()); 
+2

Se l'elenco è di tipo 'String', allora non è l'output richiesto è in * ordine naturale *? Che può essere ordinato direttamente con 'Collections.sort' senza utilizzare un comparatore personalizzato. –

+2

@TAsk se il numero di OP massimo era 9 sì, ('" 10 "<" 2 "') – Hacketo

+3

@TAsk se assumiamo che i valori tra i separatori siano limitati a singole cifre, sono d'accordo, l'ordine naturale dovrebbe funzionare bene .Il modo in cui l'ho capito, comunque, è che gli elementi tra i separatori rappresentano numeri, quindi vorremmo che "" 11-1 "' come dopo '"2-0" ', quindi l'ordinamento naturale sarebbe insufficiente. – Mureinik

Problemi correlati