如何将Set<<Set<String>>
var的所有元素添加到ArrayList<<ArrayList<String>>
?当然,我知道只是添加它们的天真方法。
private static ArrayList<ArrayList<String>> groupAnagrams(ArrayList<String> words){
ArrayList<ArrayList<String>> groupedAnagrams = new ArrayList<>();
AbstractMap<String, String> sortedWords = new HashMap<>();
Set<Set<String>> sameAnagramsSet = new HashSet<>();
for(String word : words){
char[] wordToSort = word.toCharArray();
Arrays.sort(wordToSort);
sortedWords.put(word, new String(wordToSort));
}
for(Map.Entry<String, String> entry: sortedWords.entrySet() ){
Set<String> sameAnagrams = new HashSet<>();
sameAnagrams.add(entry.getKey());
for(Map.Entry<String, String> toCompare : sortedWords.entrySet()){
if(entry.getValue().equals(toCompare.getValue())){
sameAnagrams.add(toCompare.getKey());
}
}
if(sameAnagrams.size()>0){
sameAnagramsSet.add(sameAnagrams);
}
}
//-->this line does not work! return new ArrayList<ArrayList<String>>(sameAnagramsSet);
}
答案 0 :(得分:6)
使用Java 8,您可以:
return sameAnagramsSet.stream()
.map(ArrayList::new)
.collect(toList());
虽然它返回List<ArrayList<String>>
。
它的作用:
.stream()
返回Stream<Set<String>>
.map(ArrayList::new)
相当于.map(set -> new ArrayList(set))
,基本上用数组列表替换每一组collect(toList())
将所有新创建的列表放在一个列表中答案 1 :(得分:1)
由于您希望将每个元素从Set
转换为ArrayList
,因此我认为您必须使用显式循环执行至少一小部分操作(除非您使用Java 8或第三方库):
Set<Set<String>> data = . . .
ArrayList<List<String>> transformed = new ArrayList<List<String>>();
for (Set<String> item : data) {
transformed.add(new ArrayList<String>(item));
}
请注意,我将已转换列表的类型从ArrayList<ArrayList<String>>
更改为ArrayList<List<String>>
。通常它最好是program to an interface,但是如果你真的需要一个必须包含ArrayList
特定实例的列表,你可以将其切换回来。