如何将Set <set>转换为ArrayList <arraylist> </arraylist> </set>

时间:2014-04-20 20:35:15

标签: java arraylist collections

如何将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);

          }

2 个答案:

答案 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特定实例的列表,你可以将其切换回来。