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进行排序

比排序的比较顺序进行定义,在本题应用上,先按字符串长度,后按字典序进行排序


本博客所有文章除特别声明外,大部分为学习心得,欢迎与博主联系讨论