У меня есть список строк def123, abc999, zzz000, abc123, zzz111. Я хочу, чтобы список сортировался таким образом, что первые три символа сортируются в порядке ascendng, а следующие три - в нисходящем. Таким образом, выход должен быть abc999, abc123, def123, zzz111, zzz000 Возможно ли это?сортировка строк в Java на основе подстрок
ответ
Да, это возможно. Вам нужно будет написать свой собственный Comparator
. Вот вам учебник, который поможет вам начать работу https://www.tutorialspoint.com//java/java_using_comparator.htm
Этот учебник теперь очень устаревший. Улучшения Java 8 в Comparator означают, что обычно не нужно переопределять 'compare'. Сказав это, учебник Oracle по созданию компараторов в равной степени устарел! – sprinter
В качестве атрибута вы должны создать собственный класс, включая ваш String
. Этот класс должен реализовать интерфейс Comparable.
Внутри вашего пользовательского класса вы должны переопределить метод compareTo(T o)
, который был унаследован от Comparable
. Вы должны применить свою логику сортировки.
Затем, если вы создадите Collection
(например: List<CustomClass>
), используя этот пользовательский класс в качестве типа объекта, вы можете использовать метод Collections.sort (list) для сортировки этого списка.
Полный пример можно найти here.
Разбить строки на две подстроки, а затем отсортировать с помощью comparator
. Что-то вроде этого: Demo
List<String> list = Arrays.asList("def123", "abc999", "zzz000", "abc123", "zzz111");
Comparator<String> cmp = new Comparator<String>() {
public int compare(String o1, String o2) {
int diff = (o1.substring(0,3)).compareTo(o2.substring(0,3));
return (diff == 0) ? (Integer.valueOf(o2.substring(3)).compareTo(Integer.valueOf(o1.substring(3)))): diff;
}
};
Collections.sort(list, cmp);
Мне нравится sprinter предлагаемое решение далее ... + 1 ему ...:) –
В этом специальном случае, когда исходные строки имеют равную длину с ведущими нулями, где это необходимо, вы можете просто сравнить строки без их разбора на 'int'. – Holger
Другие ответы предложили вам реализовать Comparator
. Это не больше нет необходимости с последними служебными методами, добавленными к интерфейсу в Java 8:
list.sort(Comparator
.comparing(s -> s.substring(0, 3))
.thenComparing(s -> s.subtring(3, 6), Comparator.reverseOrder()));
Также отметим, что List
теперь имеет метод sort
.
exellent :)) (Y) –
Для этого нужны и заканчиваются круглые скобки. Даже если я введу это, это даст мне ошибки компилятора. Есть идеи?? –
Если вы хотите больше алгоритмического подхода, проверить это: https://jsfiddle.net/5adpqgrc/1/
// start with ['def123', 'abc999', 'zzz000', 'abc123', 'zzz111']
var strings = ['def123', 'abc999', 'zzz000', 'abc123', 'zzz111']
$('body').append(strings.join(' ') + '<br>')
// reverse the digits
// get this ['def876', 'abc000', 'zzz999', 'abc876', 'zzz888']
strings = reverse_digits_only(strings)
$('body').append(strings.join(' ') + '<br>')
// sort it
// get this ['abc000', 'abc876', 'def876', 'zzz888', 'zzz999']
strings = strings.sort()
$('body').append(strings.join(' ') + '<br>')
// reverse the digits again
// get this ['abc999' 'abc123' 'def123' 'zzz111' 'zzz000']
strings = reverse_digits_only(strings)
$('body').append(strings.join(' ') + '<br>')
function reverse_digits_only (strings) {
return strings.map(function (string) {
var first_three_letters = string.substring(0, 3)
var reversed_digits = string.substring(3).split('').map(function (digit) {
return 9 - digit
})
return first_three_letters + reversed_digits.join('')
})
}
Как это работает в том, что вы:
- Реверс цифр (abc999 становится abc000)
- Тогда Сортируйте его естественно
- И затем снова отформатируйте цифры.
- 1. Удаление строк на основе подстрок
- 2. Сортировка строк на основе сходства
- 3. сортировка строк на java
- 4. Java Замена нескольких подстрок (на основе индексов)
- 5. Сортировка строк в массиве на основе длины
- 6. Присвоение списка строк конкретным значениям на основе их подстрок
- 7. Сортировка на основе строки java
- 8. Сортировка строк SSRS на основе значений столбцов
- 9. Сортировка списка списков на основе списка строк
- 10. Сортировка R строк на основе количества повторений
- 11. Поиск подстрок в Java
- 12. сортировка панда dataframe на основе частоты строк
- 13. Сортировка списка смешанных строк на основе цифр
- 14. Сортировка строк на основе количества отдельных символов
- 15. Сортировка на основе другой коллекции в Java
- 16. Сравнение подстрок в Java
- 17. Пользовательская сортировка строк в java
- 18. Сортировка списка строк на основе другого списка строк
- 19. Сравнение строк текста на основе слов внутри строк Java
- 20. Java Сортировка списка на основе другого списка
- 21. Сортировка объектов Java на основе ключа
- 22. сортировка строк на основе данных в середине строки (в python)
- 23. Сортировка строк в сущности на основе атрибута в основных данных
- 24. Сортировка строк данных на основе символов и его длина
- 25. SQL-подселективная фильтрация на основе нескольких подстрок
- 26. Java: Сортировка массива числовых строк
- 27. Сортировка векторов строк на основе строки строки (даты) в R
- 28. Выбор и сортировка строк в кадре данных на основе вектора
- 29. Сортировка массива строк на основе символа в строке
- 30. Python - Сортировка строк в файле на основе первого слова?
Все возможно, но если вы хотите помочь, вам нужно попытаться решить проблему. Поэтому я укажу вам в правильном направлении. Вам необходимо реализовать Comparable, http://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property – Leon
Сопоставимый здесь не подходит, поскольку строки являются окончательными. –
('Comparable не подходит здесь, поскольку строки являются окончательными' - применяет _if_' string' из вопроса 'java.lang.String'. (Тогда есть такие вещи, как [AspectJ] (http://eclipse.org/aspectj) ...).) – greybeard