Problem:
Given an array of strings, group anagrams together.
For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Return:
[
[“ate”, “eat”,”tea”],
[“nat”,”tan”],
[“bat”]
]
Note:
- For the return value, each inner list’s elements must follow the lexicographic order.
- All inputs will be in lower-case.
- The signature of the function had been updated to return list
<list<string>>
instead of list, as suggested here. If you still see your function signature return a list, please click the reload button to reset your code definition.
Analysis:
以下代码是看了一位大神的代码之后改的,这段代码有些地方自己不太容易想到的和需要注意的,在此记录以下:
1 Map<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();这是一种Map的创建方式,Map定义但是new HashMap
。
2 利用for(String str : strs)这种foreach代码看起来比较简洁,应该以后的代码多采用,引起注意。
3 在一个函数中代码比较多的时候可以分开另一个函数,如Sortstr(),但是要注意定义到groupAnagrams()函数之外。
4 其实代码中的以下这段代码写的比较啰嗦,
if(map.containsKey(sortedstr)){
map.get(sortedstr).add(str);
}
else{
map.put(sortedstr,new ArrayList<String>());
map.get(sortedstr).add(str);
}
因为可以让if中放!map.containsKey(sortedstr)
这样就不用写两次 map.get(sortedstr).add(str);
所以应该是:
if (map.get(sortedStr) == null){
map.put(sortedStr, new ArrayList<String>());
}
map.get(sortedStr).add(str);
5 List<List<String>> result = new ArrayList<List<String>>(map.values());
也是一个需要学习的点
6 Collections.sort(res);
利用了Collection这个借口的函数,注意:
Collection > List > ArrayList
7 return new String(char1);
非常好,创建的同时并赋值。
Anwser:
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
for(String str : strs){
String sortedstr = Sortstr(str);
if(map.containsKey(sortedstr)){
map.get(sortedstr).add(str);
}
else{
map.put(sortedstr,new ArrayList<String>());
map.get(sortedstr).add(str);
}
}
List<List<String>> result = new ArrayList<List<String>>(map.values());
for(List<String> res : result){
Collections.sort(res);
}
return result;
}
private String Sortstr(String str){
char[] char1 = str.toCharArray();
Arrays.sort(char1);
return new String(char1);
}
}