2016-09-12 3 views
3

У меня есть список строк def123, abc999, zzz000, abc123, zzz111. Я хочу, чтобы список сортировался таким образом, что первые три символа сортируются в порядке ascendng, а следующие три - в нисходящем. Таким образом, выход должен быть abc999, abc123, def123, zzz111, zzz000 Возможно ли это?сортировка строк в Java на основе подстрок

+5

Все возможно, но если вы хотите помочь, вам нужно попытаться решить проблему. Поэтому я укажу вам в правильном направлении. Вам необходимо реализовать Comparable, http://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property – Leon

+0

Сопоставимый здесь не подходит, поскольку строки являются окончательными. –

+0

('Comparable не подходит здесь, поскольку строки являются окончательными' - применяет _if_' string' из вопроса 'java.lang.String'. (Тогда есть такие вещи, как [AspectJ] (http://eclipse.org/aspectj) ...).) – greybeard

ответ

2

Да, это возможно. Вам нужно будет написать свой собственный Comparator. Вот вам учебник, который поможет вам начать работу https://www.tutorialspoint.com//java/java_using_comparator.htm

+1

Этот учебник теперь очень устаревший. Улучшения Java 8 в Comparator означают, что обычно не нужно переопределять 'compare'. Сказав это, учебник Oracle по созданию компараторов в равной степени устарел! – sprinter

0

В качестве атрибута вы должны создать собственный класс, включая ваш String. Этот класс должен реализовать интерфейс Comparable.

Внутри вашего пользовательского класса вы должны переопределить метод compareTo(T o), который был унаследован от Comparable. Вы должны применить свою логику сортировки.

Затем, если вы создадите Collection (например: List<CustomClass>), используя этот пользовательский класс в качестве типа объекта, вы можете использовать метод Collections.sort (list) для сортировки этого списка.

Полный пример можно найти here.

0

Разбить строки на две подстроки, а затем отсортировать с помощью 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); 
+0

Мне нравится sprinter предлагаемое решение далее ... + 1 ему ...:) –

+0

В этом специальном случае, когда исходные строки имеют равную длину с ведущими нулями, где это необходимо, вы можете просто сравнить строки без их разбора на 'int'. – Holger

7

Другие ответы предложили вам реализовать Comparator. Это не больше нет необходимости с последними служебными методами, добавленными к интерфейсу в Java 8:

list.sort(Comparator 
    .comparing(s -> s.substring(0, 3)) 
    .thenComparing(s -> s.subtring(3, 6), Comparator.reverseOrder())); 

Также отметим, что List теперь имеет метод sort.

+0

exellent :)) (Y) –

+0

Для этого нужны и заканчиваются круглые скобки. Даже если я введу это, это даст мне ошибки компилятора. Есть идеи?? –

-1

Если вы хотите больше алгоритмического подхода, проверить это: 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('') 
    }) 
} 

Как это работает в том, что вы:

  1. Реверс цифр (abc999 становится abc000)
  2. Тогда Сортируйте его естественно
  3. И затем снова отформатируйте цифры.
Смежные вопросы