首页 文章

将Set转换为List而不创建新List

提问于
浏览
404

我使用此代码将 Set 转换为 List

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

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

我想避免在循环的每次迭代中创建一个新列表 . 那可能吗?

12 回答

  • 2

    最简单的解决方案

    我想要一个非常快速的方法将我的设置转换为List并返回它,所以在一行中我做了

    return new ArrayList<Long>(mySetVariable);
    
  • 2

    您可以使用以下一行更改: 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()])));
    }
    
  • 72

    我会做 :

    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);
    }
    
  • 4

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

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

    EDIT: 作为对问题编辑的回应 .
    很容易看出,如果你想将 MapList s作为值,为了得到k个不同的值,你需要创建k个不同的列表 .
    因此:您根本无法避免创建这些列表,必须创建列表 .

    可能的解决方法:
    Map 声明为 Map<String,Set>Map<String,Collection> ,然后插入您的设置 .

  • 2

    使用构造函数转换它:

    List<?> list = new ArrayList<?>(set);
    
  • 369

    同样来自Guava Collect库,您可以使用 newArrayList(Collection)

    Lists.newArrayList([your_set])
    

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

  • 700

    我们可以在Java 8中使用以下一个内容:

    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());
    }
    
  • 11

    我创建简单的 static 方法:

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

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

    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;
    }
    
  • 31

    Java 8提供了使用流的选项,您可以从 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不保证 . 如上所述here

    无法保证返回的List的类型,可变性,可序列性或线程安全性;如果需要更多地控制返回的List,请使用toCollection(Supplier) .

    如果您想确保始终如此,那么您可以专门请求实例:

    List<String> stringArrayList = setString.stream()
                         .collect(Collectors.toCollection(ArrayList::new));
    
  • 6

    最近我发现了这个:

    ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));
    
  • -15

    我发现这个工作正常,可用于从Set创建List .

    ArrayList < String > L1 = new ArrayList < String > ();
    L1.addAll(ActualMap.keySet());
    for (String x: L1) {
        System.out.println(x.toString());
    }
    
  • 1
    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));
    }
    

相关问题