Сортировка буквенно-цифровых строк java

У меня есть этот массив, хранящий суффикс некоторых URL-адресов, добавляемых пользователем:

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

Когда я это делаю:

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

Моя проблема:

Я хочу изменить это условие For , передав другой список, сопоставляющий данные, отсортированные как [U1, U2, U3, U4, U5, U6, U7, U8] .

Я хотел бы, чтобы ваша помощь знала, как наилучшим образом я могу это сделать.

Я думал о создании массива, перечисляющего идентификаторы, а затем сортировки, но я не знаю, как точно сортировать буквенно-цифровые строки в java.

Я решил использовать идею @Abu, но я ее адаптировал:

  1. Я проверяю идентификаторы URL-адресов, которые пользователь пытается добавить,
  2. Я удаляю алфавитный суффикс в этом id, а затем создаю ArrayList для хранения числовой части каждого идентификатора.
  3. Я сортирую этот ArrayList как @Abu научил меня в его ответе, а затем я проверяю каждый идентификатор в этом отсортированном ArrayList в последовательности, которую он должен добавить.

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

Просто используйте метод Collections.sort() после создания ArrayList ваших значений, например:

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

Вывод :

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

Создайте собственный 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)); } } 

а затем используйте Arrays.sort(urlAttachments, new IdComparator()); до итерации по нему. В зависимости от деталей вы можете продвинуть эту логику сортировки в getUrlAttachments() и сохранить код, который вы разместили точно так, как сейчас.

Я думаю, что то, что вы просите, похоже на это:

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

Вы можете разбить строку на чистую строку и числовую строку. например: abc123 будет разделен на «abc» и «123». Вы можете сравнить буквенную строку с обычным сравнением, а затем отсортировать «123» таких строк, у вас есть два варианта: 1: преобразовать его в Integer, а затем сравнить 2 : Если число не соответствует диапазону Integer, вы можете сравнить букву.

например, «123» против «133» сравните «1» и «1» = равный. Сравните «2» и «3» = больше так «123» <«133».

Вариант 2 является более точным и менее защищенным от ошибок.

  • возможно ли выполнить quicksort списка только с одним прохождением?
  • Сортировка одного списка другим
  • Swift - сортировка массива объектов с несколькими критериями
  • Порядок Mysql по определенным значениям идентификатора
  • Как сортировать по двум полям в Java?
  • Как разрешить sortedArrayUsingSelector использовать целое число для сортировки вместо String?
  • Сортировка таблицы jQuery
  • Выполнение qsort vs std :: sort?
  • Сортировка таблицы в Lua
  • Почему мой цикл сортировки, кажется, добавляет элемент, где он не должен?
  • Пользовательская логика сортировки в OrderBy с использованием LINQ
  • Давайте будем гением компьютера.