Сортировка строк, содержащих номер в Java

У меня проблема с компаратором по умолчанию для строк (в SortedSet). Проблема заключается в том, что компаратор по умолчанию не сортирует хорошие строки, содержащие числа, то есть: В наборе i есть:

room1, room2, room100 

Естественный порядок должен быть как выше, но в наборе у меня есть:

 room1, room100, room2 

Я знаю, почему это так, но я не знаю, как это изменить.

Попробуйте этот компаратор, который удаляет все символы без цифр, а затем сравнивает оставшиеся символы как числа:

 Collections.sort(strings, new Comparator() { public int compare(String o1, String o2) { return extractInt(o1) - extractInt(o2); } int extractInt(String s) { String num = s.replaceAll("\\D", ""); // return 0 if no digits found return num.isEmpty() ? 0 : Integer.parseInt(num); } }); 

Вот тест:

 public static void main(String[] args) throws IOException { List strings = Arrays.asList("room1", "foo", "room2", "room100", "room10"); Collections.sort(strings, new Comparator() { public int compare(String o1, String o2) { return extractInt(o1) - extractInt(o2); } int extractInt(String s) { String num = s.replaceAll("\\D", ""); // return 0 if no digits found return num.isEmpty() ? 0 : Integer.parseInt(num); } }); System.out.println(strings); } 

Вывод:

 [foo, room1, room2, room10, room100] 

попробуй это. Я предположил, что у вас всегда будет «комната» в начале вашей строки.

  List list = Arrays.asList("room1", "room100", "room2"); Collections.sort(list, new Comparator() { @Override public int compare(String o1, String o2) { return new Integer(o1.replaceAll("room", "")) .compareTo(new Integer(o2.replaceAll("room", ""))); } }); 

Используется @bohemian ответ. Просто немного улучшилось. Это сработало для меня очень хорошо ..

  Collections.sort(asdf, new Comparator() { public int compare(String o1, String o2) { String o1StringPart = o1.replaceAll("\\d", ""); String o2StringPart = o2.replaceAll("\\d", ""); if(o1StringPart.equalsIgnoreCase(o2StringPart)) { return extractInt(o1) - extractInt(o2); } return o1.compareTo(o2); } int extractInt(String s) { String num = s.replaceAll("\\D", ""); // return 0 if no digits found return num.isEmpty() ? 0 : Integer.parseInt(num); } }); 

Вот моя реализация Comparator для такого рода: (строки могут начинаться с любых символов)

 public class StringNumberComparator implements Comparator{ @Override public int compare(String o1, String o2) { int i1 = this.getRearInt(o1); int i2 = getLeadingInt(o2); String s1 = getTrailingString(o1); String s2 = getTrailingString(o2); if(i1==i2) return s1.compareTo(s2); if(i1>i2) return 1; else if(i1 

Вы можете реализовать компаратор и передать его в конструктор set. См. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html .

Если все ваши строки находятся в форме комнаты [номер], вы можете лишить «комнату» разобрать номер и сравнить его.
В качестве альтернативы – вы можете сохранить целые числа, которые вы установили, и распечатать их с помощью префикса «номер».

Ленивой альтернативой было бы заставить String-компаратор работать, не делая ничего лишнего (определяя ваш собственный компаратор). Вы можете получить это room0001, room0002, room0100 нулями номера внутри вашей строки следующим образом: room0001, room0002, room0100 тогда будет использован компаратор String по умолчанию. Тем не менее, вам нужно знать максимальное значение числа, чтобы вы могли соответствующим образом адаптировать ваше дополнение.

  • Сортировка HashMap значениями
  • Сортировка поля varchar численно в MySQL
  • Сортировка таблицы jQuery
  • Есть ли поддержка в C ++ / STL для сортировки объектов по атрибуту?
  • Сортировка таблицы в Lua
  • Быстрая реализация алгоритма для сортировки очень малого списка
  • Закажите «смешанный» вектор (цифры с буквами)
  • Сортировать по:
  • Сортировка 2D-массива в C ++ с использованием встроенных функций (или любого другого метода)?
  • Использование компаратора для создания пользовательской сортировки
  • Учитываются ли в имени столбца и таблицы имена в MySQL?
  • Давайте будем гением компьютера.