class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>>map=new HashMap<>();for(String s:strs){char []sortedS=s.toCharArray();Arrays.sort(sortedS);map.computeIfAbsent(new String(sortedS),_ -> new ArrayList<>()).add(s);//map.computeIfAbsent(sortedS,String -> new ArrayList<>()).add(s);}return new ArrayList<>(map.values());//map可以直接返回所有的values和keys}
}
- String字符串具有不可变性,内置不存在sort排序函数,所以要转换成字符数组,使用字符数组的方法进行排序。在JDK9之前默认使用的是char类型数组,在jdk9之后默认使用Byte[]数组,如果有非ASCLL码字符再使用char。使用toCharArray()是把String底层的字符数组复制了一份。
- 对于排序也可以使用流String sortedS=Arrays.stream(s.split("")).sorted().collect(Collectors.joining());直接通过流进行排序。
1.在这个操作中s.split(String regex)参数是正则表达式,传入""表示按照这个对字符进行分割,
示例:s = "bac" → s.split("") → 得到 String[] arr = {"b", "a", "c"};
2.Arrays.stream()把这个字符串数组转换成流
3.sorted()使用自然排序规则,依赖String实现的Comparable接口里面的CompareTo()方法,通过Unicode进行比较
- map的computeIfAbsent方法会先判断sortedS这个字符串是否存在,如果不存在创建一个空的ArrayList并且把字符串s放进去。
map.computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction),首先会判断这个key是否存在,如果存在返回对应的值,此题返回对应的List集合,如果不存在执 行第二个lambda表达式。_ -> 表示忽略传入参数类型也就是K,也可以写成String明确他的传入参数,然后返回我们创建的这个值,再执行add直接添加