如何基于Java Collator,用Arrays.sort结合Comparator和Lambda实现排序?
太棒了,你已经用冒泡排序结合Collator搞定了字符串排序!不过Java标准库的Arrays.sort()可比冒泡排序高效多了(它用的是双枢轴快速排序,时间复杂度O(n log n),而冒泡是O(n²)),而且结合Comparator和Lambda能让代码更简洁优雅。下面给你两种实现方式,还有一些实用技巧:
方法1:使用匿名内部类实现Comparator
这种方式比较直观,把Collator的比较逻辑包装进Comparator的匿名实现里:
import java.text.Collator; import java.util.Arrays; import java.util.Comparator; public class StringSorter { // 你的原有冒泡排序实现 public static void sortStrings(Collator collator, String[] words) { String tmp; for (int i = 0; i < words.length; i++) { for (int j = i + 1; j < words.length; j++) { if (collator.compare(words[i], words[j]) > 0) { tmp = words[i]; words[i] = words[j]; words[j] = tmp; } } } } // 基于Comparator的排序方法 public static void sortWithCollatorComparator(Collator collator, String[] words) { Arrays.sort(words, new Comparator<String>() { @Override public int compare(String s1, String s2) { // 直接复用Collator的本地化比较逻辑 return collator.compare(s1, s2); } }); } }
方法2:使用Lambda表达式(含方法引用)
因为Comparator是函数式接口,我们可以用Lambda表达式大幅简化代码,甚至用方法引用让代码更干净:
// 基于Lambda的排序方法 public static void sortWithCollatorLambda(Collator collator, String[] words) { // 基础Lambda写法 Arrays.sort(words, (s1, s2) -> collator.compare(s1, s2)); // 更简洁的方法引用写法(推荐) Arrays.sort(words, collator::compare); }
实用技巧和注意事项
- 优先用方法引用:
collator::compare这种方法引用比Lambda表达式更简洁,可读性也更强,只要逻辑是直接调用现有方法,就优先用它。 - 配置Collator满足需求:根据你的业务场景调整Collator的参数,比如:
- 设置排序强度:
collator.setStrength(Collator.PRIMARY)会忽略大小写和重音;SECONDARY忽略大小写但区分重音;TERTIARY会区分所有细节(默认)。 - 设置分解模式:
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION)能正确处理带重音的字符(比如把é和e´视为等价)。
- 设置排序强度:
- 处理空值:如果数组可能包含
null,可以在比较逻辑里添加空值判断,比如把null排在最前面:Arrays.sort(words, (s1, s2) -> { if (s1 == null && s2 == null) return 0; if (s1 == null) return -1; if (s2 == null) return 1; return collator.compare(s1, s2); }); - 线程安全提醒:
Collator实例是线程不安全的,不要在多线程环境下共享同一个实例。如果需要多线程使用,可以用ThreadLocal<Collator>为每个线程创建独立实例,或者每次调用排序时新建Collator。
内容的提问来源于stack exchange,提问作者blaise
相关产品推荐
相关产品推荐

