Краткий ответ
Да, это так. Вам нужен собственный компаратор строк.
Решение
Допустим, вам нужно отсортировать список строк:
[a_123, ab123, a123, 123, _123]
Если вы сортируете его, используя Collections.sort
, тогда он будет отсортирован в следующем порядке:
[123, _123, a123, a_123, ab123]
Но вы хотите переопределить «вес» _
. Для этого вам нужен собственный компаратор строк. Давайте скопируем и изменим немного java.lang.String#compareTo
:
private int customStringComparator(String s1, String s2) {
int len1 = s1.length();
int len2 = s2.length();
int lim = Math.min(len1, len2);
char v1[] = s1.toCharArray();
char v2[] = s2.toCharArray();
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
// You can add your custom comparison here:
if ('_' == c1 && Character.isDigit(c2)) {
// We intentionally return inverted result
return c2 - c1;
}else if(c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
Теперь мы можем передать customStringComparator
на Collections.sort
:
Collections.sort(list, this::customStringComparator);
Список будет отсортирован в следующем порядке:
[_123, 123, a_123, a123, ab123]
Как видите, теперь _
предшествует цифрам.