Collections.sort()用法
Collections.sort()用法
在做算法题时,碰到了这样的一道:删除 s 中的一些字符,使得它构成字符串列表 d 中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序的最小字符串。
>Example 1: Input: s = "abpcplea", d = ["ale","apple","monkey","plea"] >Output: "apple"
解题过程中需要对列表进行自定义比较器定义,之前只用过自然排序,在此进行总结
>public class LongestWordInDictonary { public static void main(String[] args) throws Exception { //数组转列表 List<String> dict = Arrays.asList("ale", "apple", "monkey", "plea"); System.out.println(new LongestWordInDictonary().findLongestWord("abpcplea", dict)); } public String findLongestWord(String s, List<String> d) { Collections.sort( d, Comparator.comparing(String::length).reversed().thenComparing(String::compareTo)); for (String str : d) { if (str.length() <= s.length()) { int i = 0, j = 0; for (int l1 = s.length(), l2 = str.length(); i < l1 && j < l2; ) { if (s.charAt(i) == str.charAt(j)) { i++; j++; } else { i++; } } if (j >= str.length()) return str; } } return ""; } >}
Collections类里有sort()的两个方法。第一种只需传入被排序的集合,便会为它自然排序。第二种需要我们自定义排序的方式,细则可以创建一个比较器来进行排序,Comparator也是属于函数式接口,我们也能使用lambda表达式。对上述代码使用的方法进行总结。
使用Comparator.comparing进行排序
首先查看Comparator类的内部实现comparing,查询如下:
public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator)
{
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return (Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2));
}
可以看到比较器参数keyComparator ,用来创建自定义比较器
即对应上述片段。
Comparator.comparing(String::length)
使用Comparator.reversed进行排序
返回相反的排序规则
使用Comparator.thenComparing进行排序
比排序的比较顺序进行定义,在本题应用上,先按字符串长度,后按字典序进行排序
本博客所有文章除特别声明外,大部分为学习心得,欢迎与博主联系讨论