转换设置为列表而不创build新的列表
我正在使用此代码将一个Set
转换为一个List
:
Map<String, List> mainMap = new HashMap<String, List>(); for(int i=0; i<something.size(); i++){ Set set = getSet(...); //return different result each time List listOfNames = new ArrayList(set); mainMap.put(differentKeyName,listOfNames); }
我想避免在循环的每个迭代中创build一个新的列表。 那可能吗?
您可以使用List.addAll()方法。 它接受一个Collection作为参数,而你的设置是一个Collection。
mainList.addAll(set);
编辑:作为对问题编辑的回应。
很容易看出,如果你想要一个带有List
的Map
作为值,为了有k个不同的值,你需要创buildk个不同的列表。
因此:根本无法避免创build这些列表,必须创build列表。
可能的解决方法:
将Map
声明为Map<String,Set>
或Map<String,Collection>
,然后插入你的set。
使用构造函数来转换它:
List<?> list = new ArrayList<?>(set);
也可以从Guava Collect库中,使用newArrayList(Collection)
:
Lists.newArrayList([your_set])
这和以前的答案非常相似,除了你不需要声明(或实例化)任何list
对象。
我们可以在Java 8中使用以下一个class轮:
List<String> list = set.stream().collect(Collectors.toList());
这是一个小例子:
public static void main(String[] args) { Set<String> set = new TreeSet<>(); set.add("A"); set.add("B"); set.add("C"); List<String> list = set.stream().collect(Collectors.toList()); }
我会做 :
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); }
您可以使用这一行更改: Arrays.asList(set.toArray(new Object[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()]))); }
最近我find了这个
ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));
我创build了简单的static
方法:
public static <U> List<U> convertSetToList(Set<U> set) { return new ArrayList<U>(set); }
…或者如果你想设置types的列表你可以使用:
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; }
我发现这个工作很好,有用的创build一个列表从一个集合。
ArrayList < String > L1 = new ArrayList < String > (); L1.addAll(ActualMap.keySet()); for (String x: L1) { System.out.println(x.toString()); }
Java 8提供了使用stream的选项,您可以从Set<String> setString
获取一个列表,如下所示:
List<String> stringList = setString.stream().collect(Collectors.toList());
虽然现在的内部实现提供了一个ArrayList
的实例:
public static <T> Collector<T, ?, List<T>> toList() { return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }, CH_ID); }
但JDK不保证它。 如上所述:
对返回的List的types,可变性,可串行性或线程安全性没有保证; 如果需要更多的对返回列表的控制,请使用toCollection(Supplier)。
如果你想确保总是那么你可以要求一个实例具体为:
List<String> stringArrayList = setString.stream() .collect(Collectors.toCollection(ArrayList::new));
Map<String, List> mainMap = new HashMap<String, List>(); for(int i=0; i<something.size(); i++){ Set set = getSet(...); //return different result each time mainMap.put(differentKeyName, new ArrayList(set)); }