提问人:ericsoco 提问时间:7/26/2012 最后编辑:Mifeetericsoco 更新时间:1/2/2021 访问量:114615
从数组创建可变列表?
Create mutable List from array?
问:
我有一个数组,我想变成一个 ,以便修改数组的内容。List
Stack Overflow 有很多问题/答案,这些问题/答案解决了它如何只提供底层数组的 List 视图,以及尝试操作生成的 List 通常会抛出一个 用于操作列表的方法(例如 、 等)不是由 提供的 List 实现实现的。Arrays.asList()
UnsupportedOperationException
add()
remove()
Arrays.asList()
但是我找不到如何将数组转换为可变列表的示例。我想我可以将数组和每个值循环到一个新的列表中,但我想知道是否存在一个接口来为我执行此操作。put()
答:
一个简单的方法:
Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
这将创建一个可变列表 - 但它将是原始数组的副本。更改列表不会更改数组。当然,您可以稍后使用 .toArray
如果你想在数组上创建一个可变视图,我相信你必须自己实现它。
评论
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
评论
myNewArrayList = new ArrayList(...)
如果您使用的是谷歌收集 API(番石榴):
Lists.newArrayList(myArray);
评论
new ArrayList<>(Arrays.asList(...))
如果您使用的是 Eclipse Collections(以前称为 GS Collections),则可以使用 或 .FastList.newListWith(...)
FastList.wrapCopy(...)
这两种方法都采用 varargs,因此您可以内联创建数组或传入现有数组。
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);
Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
这两种方法的区别在于是否复制数组。 不复制数组,因此需要恒定的时间。如果您知道数组可能会在其他地方发生突变,则应避免使用它。newListWith()
Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);
Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
注意:我是 Eclipse Collections 的提交者。
评论
这个使用 Java 8 中包含的流 API 的简单代码创建了一个包含数组元素的可变列表(或视图):
Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
或者,同样有效:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
下一个:如何从方法中更改结构体的字段?
评论