Ordinamento stringhe alfanumeriche java

Ho questo array che memorizza il suffisso di alcuni URL che l’utente sta aggiungendo:

[U2, U3, U1, U5, U8, U4, U7, U6] 

Quando faccio questo:

 for (Map map : getUrlAttachments()) { String tmpId = map.get("id"); //it receives the U2, in the 1st iteration, then U3, then U1,... if (tmpId.charAt(0) == 'U') { tmpId.charAt(1);//2, then 3, then 1,... String url = map.get("url"); String description = map.get("description"); URLAttachment attachment; String cleanup = map.get("cleanup"); if (cleanup == null && url != null && description != null) { attachment = new URLAttachmentImpl(); attachment.setOwnerClass(FileUploadOwnerClass.Event.toString()); attachment.setUrl(url); attachment.setDescription(description); attachment.setOwnerId(auctionHeaderID); attachment.setUrlAttachmentType(URLAttachmentTypeEnum.EVENT_ATTACHMENT); attachment.setDateAdded(new Date()); urlBPO.save(attachment); } 

Il mio problema:

Voglio cambiare questo For condizione passando un altro elenco mappando i dati ordinati come [U1, U2, U3, U4, U5, U6, U7, U8] .

Vorrei che il tuo aiuto sapesse qual è il modo migliore per farlo.

Ho pensato di creare un array che elencasse gli id ​​e poi di ordinare, ma non so come esattamente ordinare le stringhe alfanumeriche in java.

Ho deciso di usare l’idea che ha dato @Abu, ma l’ho adattata:

  1. Controllo gli ID degli URL che l’utente sta cercando di aggiungere,
  2. Rimuovo il suffisso alfabetico in questo id e quindi creo un ArrayList per memorizzare la parte numerica di ogni id.
  3. Ordino questa lista di array come @Abu mi ha insegnato nella sua risposta e poi ho verificato per ogni id in questo ArrayList ordinato nella sequenza che dovrebbe essere aggiunta.

     ArrayList  urlSorted = new ArrayList(); //sort the url ids for (Map map : getUrlAttachments()) { String tmpId = map.get("id"); if (tmpId.charAt(0) == 'U') { //gets the id, removing the prefix 'U' urlSorted.add( Integer.valueOf(tmpId.substring(1))); } } //sort the urlIds to check the sequence they must be added Collections.sort(urlSorted); //checks for each url id, compares if it's on the natural order of sorting to be added. for(Integer urlId: urlSorted) { for (Map map : getUrlAttachments()) { String sortedId = "U"+urlId; String tmpId = map.get("id"); //compare the ids to add the 1, then 2, then 3... if (map.get("id").equals(sortedId)) { //code to save according to the sorted ids. } } } 

Basta usare il metodo Collections.sort() dopo aver creato un ArrayList dei valori come questo:

 ArrayList a = new ArrayList(); a.add("U2"); a.add("U1"); a.add("U5"); a.add("U4"); a.add("U3"); System.out.println("Before : "+a); Collections.sort(a); System.out.println("After : "+a); 

Produzione :

 Before : [U2, U1, U5, U4, U3] After : [U1, U2, U3, U4, U5] 

Creare un Comparator> personalizzato Comparator> :

 public class IdComparator implements Comparator> { public int compare(Map left, Map right) { return orderKey(left).compareTo(orderKey(right)); } static Integer orderKey(Map m) { return Integer.parseInt(m.get("id").substring(1)); } } 

e quindi utilizzare Arrays.sort(urlAttachments, new IdComparator()); prima di iterare su di esso. A seconda dei dettagli, puoi spingere questa logica di ordinamento in getUrlAttachments() e mantenere il codice che hai pubblicato esattamente com’è ora.

Penso che quello che chiedi sia simile a questo:

http://www.davekoelle.com/alphanum.html

È ansible dividere la stringa in stringa pura e stringa numerica. per esempio: abc123 sarebbe diviso in “abc” e “123” Puoi confrontare la stringa alfabetica con il confronto normale e poi ordinare “123” tale tipo di stringhe, hai due opzioni: 1: convertilo in numero intero e poi confronta 2 : Se il numero non rientra nell’intervallo dei numeri interi, è ansible confrontare lettera per lettera.

per esempio “123” vs “133” confronta “1” e “1” = uguale Confronta “2” e “3” = maggiore quindi “123” <"133".

L’opzione 2 è più accurata e meno a prova di errore.