Альтернативный подход - тот, который сортирует любую пунктуацию до конца - может быть достигнут с использованием основанного на правилах коллатератора .
Пример:
List<String> words = Arrays.asList(
"?dog", "rat", "456", "123", "dog", "pig", "?cat", "!rat", "cat"
);
String englishRules = ("< a,A < b,B < c,C < d,D < e,E < f,F "
+ "< g,G < h,H < i,I < j,J < k,K < l,L "
+ "< m,M < n,N < o,O < p,P < q,Q < r,R "
+ "< s,S < t,T < u,U < v,V < w,W < x,X "
+ "< y,Y < z,Z < 0,1,2,3,4,5,6,7,8,9");
RuleBasedCollator rbc = new RuleBasedCollator(englishRules);
rbc.setStrength(Collator.PRIMARY);
Collections.sort(words, rbc);
words.forEach((word) -> {
out.print(word + " ");
});
Это выводит:
cat dog pig rat 123 456 !rat ?cat ?dog
Примечания:
1) Этот конкретный c пример ограничен в Engli sh сопоставление.
2) Общая техника работает, потому что все не упомянутые символы сортируются до конца. Таким образом, не только символы пунктуации сортируются после английских sh букв и цифр, но и любой другой символ / символ (например, символы, используемые в других скриптах).
3) Если вы хотите упорядочить не в Юникоде символов пунктуации, они должны быть заключены в одинарные кавычки в строке правила:
"... < 0,1,2,3,4,5,6,7,8,9 < '?' < '!'"