题目:https://leetcode-cn.com/problems/group-anagrams/https://leetcode-cn.com/problems/group-anagrams/
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<String,List<String>>();
for(String str:strs){
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
List<String> list = map.getOrDefault(key,new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
思路:由于不熟悉HashMap的使用,这一次是看完题解之后才自己仿写出来的。大概思路是,将strs[]数组中的元素排序后作为键值,若字母异位的单词在排序后是一样的,即是键值一样。因此,可以通过比键值来判断map中是否出现过当前元素。若出现过,则调出对应键值后的list,将当前元素加入到list中,最后再将该键值对应的新list添加入map中覆盖掉map中原有的list;若没出现过,则新建一个list,将当前元素放入list中,把新键值和新list一同添加到map中去。
1.声明一个HashMap,键值key是String类型的,key后对应的数据的类型是List<String>的。
Map<String,List<String>> map = new HashMap<String,List<String>>();
2.逐个遍历题目给定的strs[]数组,并把其存入一个str变量中。
for(String str:strs){
//......
}
3.将str字符串转换成char类型的数组(方便后续排序),然后对该字符串数组排序。完成排序后的字符数组转换回String类型,这个便是键值key。
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
4.声明一个list,调用getOrDefault方法。getOrDefault方法是,判断map中是否存在key值,若存在则将key值对应的List<String>类型的数据传出;若key值不存在,则执行new ArrayList<String>()。因此,如果map中没有当前的key,则list会是空的,如果map中有当前的key,则list是储存了map中对应key值后的list。然后再将str加到list中,接着把key值和对应的list加到map中去。(因为HashMap不允许相同的键值重复出现,如果传入的key重复,则会让新的list覆盖map中原有的llist,这恰恰是我们需要的效果。)
List<String> list = map.getOrDefault(key,new ArrayList<String>());
list.add(str);
map.put(key,list);
5.完成上述循环后,新建一个list装map.values(),然后返回。
return new ArrayList<List<String>>(map.values());