将集转换为列表而不创建新列表
我正在使用此代码将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 timeList listOfNames = new ArrayList(set);mainMap.put(differentKeyName,listOfNames);
}
我想避免在循环的每次迭代中创建一个新列表。 那可能吗?
#1楼
同样从Guava Collect库中,您可以使用newArrayList(Collection)
:
Lists.newArrayList([your_set])
这与amit的先前答案非常相似,除了您不需要声明(或实例化)任何list
对象。
#2楼
使用构造函数进行转换:
List<?> list = new ArrayList<?>(set);
#3楼
我发现此方法很好用,并且可以从集合创建列表。
ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {System.out.println(x.toString());
}
#4楼
您可以使用这一行更改: 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()])));
}
#5楼
我创建简单的static
方法:
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;
}
#6楼
我们可以在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());
}
#7楼
最近我发现了这一点:
ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));
#8楼
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不能保证。 如前所述这里 :
无法保证返回的List的类型,可变性,可序列化性或线程安全性; 如果需要对返回的List进行更多控制,请使用toCollection(Supplier)。
如果您想始终确定,则可以请求一个实例,具体如下:
List<String> stringArrayList = setString.stream().collect(Collectors.toCollection(ArrayList::new));
#9楼
最简单的解决方案
我想要一种非常快速的方法来将我的集合转换为List并返回它,所以我做了一行
return new ArrayList<Long>(mySetVariable);
#10楼
为了完整性...
假设您确实确实希望将Map值视为列表,但是要避免每次都将Set复制到List中。
例如,也许您正在调用一个创建Set的库函数,但是您将Map <String,List>结果传递给了一个只接受Map <String,List>的(设计欠佳,但不易使用)库函数。 ,即使您以某种方式知道它对列表所做的操作同样适用于任何集合(因此也适用于任何集合)。 并且由于某些原因,您需要避免将每个Set复制到列表的速度/内存开销。
在这种特殊情况下,根据库函数需要从列表中删除的行为(可能是未知的),您可以在每个Set上创建一个List 视图 。 请注意,这本质上是不安全的(因为可能不知不觉地更改了每个List的库函数要求),因此应首选其他解决方案。 但是,这是您的处理方式。
您将创建一个实现List接口的类,在构造函数中使用Set并将该Set分配给一个字段,然后使用该内部Set来实现List API(在可能的范围内,并按需要执行)。
请注意,某些List行为如果不将元素存储为List便根本无法模仿,而某些行为则只能部分模仿。 同样,此类通常不能安全地替代List。 尤其是,如果您知道用例需要与索引相关的操作或对列表进行“更改”,则此方法将很快发展。
public class ListViewOfSet<U> implements List<U> {private final Set<U> wrappedSet;public ListViewOfSet(Set<U> setToWrap) { this.wrappedSet = setToWrap; }@Override public int size() { return this.wrappedSet.size(); }@Override public boolean isEmpty() { return this.wrappedSet.isEmpty(); }@Override public boolean contains(Object o) { return this.wrappedSet.contains(o); }@Override public java.util.Iterator<U> iterator() { return this.wrappedSet.iterator(); }@Override public Object[] toArray() { return this.wrappedSet.toArray(); }@Override public <T> T[] toArray(T[] ts) { return this.wrappedSet.toArray(ts); }@Override public boolean add(U e) { return this.wrappedSet.add(e); }@Override public boolean remove(Object o) { return this.wrappedSet.remove(o); }@Override public boolean containsAll(Collection<?> clctn) { return this.wrappedSet.containsAll(clctn); }@Override public boolean addAll(Collection<? extends U> clctn) { return this.wrappedSet.addAll(clctn); }@Override public boolean addAll(int i, Collection<? extends U> clctn) { throw new UnsupportedOperationException(); }@Override public boolean removeAll(Collection<?> clctn) { return this.wrappedSet.removeAll(clctn); }@Override public boolean retainAll(Collection<?> clctn) { return this.wrappedSet.retainAll(clctn); }@Override public void clear() { this.wrappedSet.clear(); }@Override public U get(int i) { throw new UnsupportedOperationException(); }@Override public U set(int i, U e) { throw new UnsupportedOperationException(); }@Override public void add(int i, U e) { throw new UnsupportedOperationException(); }@Override public U remove(int i) { throw new UnsupportedOperationException(); }@Override public int indexOf(Object o) { throw new UnsupportedOperationException(); }@Override public int lastIndexOf(Object o) { throw new UnsupportedOperationException(); }@Override public ListIterator<U> listIterator() { throw new UnsupportedOperationException(); }@Override public ListIterator<U> listIterator(int i) { throw new UnsupportedOperationException(); }@Override public List<U> subList(int i, int i1) { throw new UnsupportedOperationException(); }
}...
Set set = getSet(...);
ListViewOfSet listOfNames = new ListViewOfSet(set);
...
#11楼
由于到目前为止尚未提及它,因此从Java 10开始,您可以使用新的copyOf
工厂方法:
List.copyOf(set);
从Javadoc :
以迭代顺序返回包含给定Collection元素的不可修改List 。
#12楼
您可以使用List.addAll()方法。 它接受Collection作为参数,而您的集合就是Collection。
List<String> mainList = new ArrayList<String>();
mainList.addAll(set);
编辑:作为对问题的编辑的回应。
很容易看出,如果要使用一个List
为List
的Map
作为值,为了拥有k个不同的值,您需要创建k个不同的列表。
因此:您完全无法避免创建这些列表,必须创建列表。
可能的解决方法:
将Map
声明为Map<String,Set>
或Map<String,Collection>
,然后插入您的地图集。
#13楼
我会做 :
Map<String, Collection> mainMap = new HashMap<String, Collection>();for(int i=0; i<something.size(); i++){Set set = getSet(...); //return different result each timemainMap.put(differentKeyName,set);
}
#14楼
Map<String, List> mainMap = new HashMap<String, List>();for(int i=0; i<something.size(); i++){Set set = getSet(...); //return different result each timemainMap.put(differentKeyName, new ArrayList(set));
}
将集转换为列表而不创建新列表相关推荐
- android 裁剪圆角矩形,android – 如何使用中心裁剪创建部分圆角矩形可绘制而不创建新位图?...
背景 我已经看过如何用位图创建一个圆形的drawable,以及如何在它周围添加一个轮廓(AKA笔划),here. 问题 我无法找到如何在不绘制新位图的情况下仅对位图的某些角进行舍入,而不是创建新的位图 ...
- python中如何创建一个空列表_Python创建空列表的字典2种方法详解
如果要在 Python 中创建键值是空列表的字典,有多种方法,但是各种方法之间是否由区别?需要作实验验证,并且分析产生的原因.本文针对两种方法做了实验和分析. 如果要在 Python 中创建一个键值都 ...
- 我在达内学安卓-基于ArrayAdapter创建单一对象列表方式创建联系人列表!
学习安卓怎么学?从界面开始.到各种控件到四大金刚,再到各种不同的应用方法和应用方式,却是很容易把自己学晕,怎么办呢? 先理清思路,然后从控件一个一个的开始学起,自从来到达内学习,由于之前的理解都是面对 ...
- python创建数字列表_Python创建数字列表
[一]range()函数在python中可以使用range()函数来产生一系列数字for w in range(1,11): print(w) 输出: 1 2 3 4 5 6 7 8 9 10 #注意 ...
- python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )
创建数值列表 需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分.在数据可视化中,处理的几乎都是由数字(如温度.距离.人口数量.经度和纬度等)组成的 ...
- MDaemon邮件列表的使用(一):邮件列表的创建及简单管理
列表最直观的作用就是用于快速简洁的进行邮件群发. 邮件列表有时候称之为邮件组或者分发列表,允许多用户组地址被组合起来就好像他们共享一个公共邮箱.发送到列表的电子邮件的副本分发到列表里的每一个成员.列表 ...
- Excel 创建多级列表
近期由于数据整理,需要用到excel的多级列表相关知识,现整理如下. 1 原理 多级列表的原理一句话总结为:依据父级列表内容与子级列表标题相同的关系,逐级索引. 2 实现 (1)数据源 (2)索引关系 ...
- python列表反向_python反向列表
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我正在尝试根据最高值创建某种记分牌. 我添加了reverse = true标志但 ...
- python 列表推导式csv_Python 列表推导式
在本教程中,我们将学习使用 Python 列表推导. Python 列表推导式 列表推导式是一种基于现有列表创建列表的语法结构. 列表推导式为创建列表提供了一种简洁的方法. 常见的要求是创建新列表,其 ...
最新文章
- CNN边缘检测--Richer Convolutional Features for Edge Detection
- deploy service on swarm
- 【Python】Excel处理
- DNS服务(二)——常用资源记录类型详解
- 机房漏水后,漏水报警器是如何检测应急处理的?
- 张家口zec挖矿软件哪里下载_AMTO软件下载-AMTO挖矿官网版v1.1
- 1.4 第一个Python程序
- [Erlang 0097] TCP半开的几个小测试
- UIImage 压缩
- SQL Azure十月份更新
- ^_^直接用脚本分割日志,不用工具。
- struts2 自带的 token防止表单重复提交拦截器
- android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
- 88.合并两个有序数组(力扣leetcode)博主可答疑该问题
- el 能否定义作用域变量_EL表达式语法简介及其使用
- 智能交通系统系统中的车牌识别技术
- ftp服务器匿名用户文件夹,ftp服务器匿名用户文件夹
- java中HelloWorld原来还可以这样玩
- 第5-6周-实验作业-串口通信小试
- OpenCV中傅里叶变换和反变换的运用