我正在使用这段代码将一个Set转换为一个List:

Map<String, List<String>> mainMap = new HashMap<>();

for (int i=0; i < something.size(); i++) {
  Set<String> set = getSet(...); //returns different result each time
  List<String> listOfNames = new ArrayList<>(set);
  mainMap.put(differentKeyName, listOfNames);
}

我希望避免在循环的每次迭代中创建一个新列表。这可能吗?


当前回答

您可以使用以下一行更改:toArray(新对象(set.size ())))

Map<String, List> mainMap = new HashMap<String, List>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); 
  mainMap.put(differentKeyName, Arrays.asList(set.toArray(new Object[set.size()])));
}  

其他回答

您可以使用List.addAll()方法。它接受一个集合作为参数,您的集合就是一个集合。

List<String> mainList = new ArrayList<String>();
mainList.addAll(set);

编辑:作为对问题编辑的回应。 很容易看出,如果您想要有一个带有列表作为值的Map,为了有k个不同的值,您需要创建k个不同的列表。 因此:您根本无法避免创建这些列表,必须创建这些列表。

可能的解决方法: 声明你的Map为Map<String,Set>或Map<String,Collection>,然后插入你的Set。

同样从Guava收集库,你可以使用newArrayList(收集):

Lists.newArrayList([your_set])

这与amit之前的回答非常相似,只是您不需要声明(或实例化)任何列表对象。

我会这样做:

Map<String, Collection> mainMap = new HashMap<String, Collection>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //return different result each time
  mainMap.put(differentKeyName,set);
}

我创建一个简单的静态方法:

public static <U> List<U> convertSetToList(Set<U> set)
{
    return new ArrayList<U>(set);
}

... 或者如果你想设置列表的类型,你可以使用:

public static <U, L extends List<U>> List<U> convertSetToList(Set<U> set, Class<L> clazz) throws InstantiationException, IllegalAccessException
{
    L list = clazz.newInstance();
    list.addAll(set);
    return list;
}

我发现这工作很好,有用的从一个集合创建一个列表。

ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {
    System.out.println(x.toString());
}