Clasificación de cadenas alfanuméricas Java

Tengo esta matriz que almacena el sufijo de algunas URL que el usuario está agregando:

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

Cuando hago esto:

 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); } 

Mi problema:

Quiero cambiar esta condición For pasando otra lista mapeando los datos ordenados como [U1, U2, U3, U4, U5, U6, U7, U8] .

Me gustaría tu ayuda para saber cuál es la mejor manera de que pueda hacer esto.

Pensé en crear una matriz que enumerara los ID y luego ordenarlos, pero no sé cómo ordenar exactamente las cadenas alfanuméricas en java.

Decido usar la idea que dio @Abu, pero la adapté:

  1. Verifico las identificaciones de las URL que el usuario está tratando de agregar,
  2. Elimino el sufijo alfabético en este ID y luego creo un ArrayList para almacenar la parte numérica de cada identificación.
  3. Ordeno este ArrayList como @Abu me enseñó en su respuesta y luego verifico para cada identificación en esta ArrayList ordenada en la secuencia que debería agregarse.

     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. } } } 

Simplemente use el método Collections.sort() después de crear una lista de ArrayList de sus valores de esta manera:

 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); 

Salida:

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

Cree un Comparator> personalizado 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)); } } 

y luego use Arrays.sort(urlAttachments, new IdComparator()); antes de iterar sobre eso. Dependiendo de los detalles, puede insertar esta lógica de clasificación en getUrlAttachments() y mantener el código que ha publicado exactamente tal como está ahora.

Creo que lo que estás preguntando es similar a este:

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

Puede dividir la secuencia en cadena pura y cadena numérica. por ejemplo: abc123 se dividiría en “abc” y “123” Puede comparar cadenas alfabéticas con comparación normal y luego ordenar “123” ese tipo de cadenas, tiene dos opciones: 1: Convertirlo en Entero y luego comparar 2 : Si el número no cabe en el rango entero, puede comparar letra por letra.

por ejemplo, “123” frente a “133” compare “1” y “1” = igual. Compare “2” y “3” = mayor, por lo tanto, “123” <"133".

La opción 2 es más precisa y menos a prueba de errores.