将数组列表附加到数组并在 kotlin 中重复此操作
Posted
技术标签:
【中文标题】将数组列表附加到数组并在 kotlin 中重复此操作【英文标题】:Append List of array to an array and repeat this in kotlin 【发布时间】:2022-01-21 02:07:36 【问题描述】:我似乎找不到合适的解决方案。试图将数组列表添加到另一个数组。以我的 Python 背景,这很容易完成,但在 Kotlin 中却不是。
val extra = arrayOf(7,7,7)
fun containerArray()
val even = arrayOf(2, 4, 6)
val odd = arrayOf(1, 3, 5)
val arr1 = arrayOf(even, odd)
val arr2 = arrayOf(*arr1, extra)
print(arr2.contentDeepToString())
fun main()
for (i in 1..3)
containerArray()
执行上述代码时,我收到...
[[2, 4, 6], [1, 3, 5], [7, 7, 7]][[2, 4, 6], [1, 3, 5], [7,7, 7]][... 我想要实现的是这个....
[ [2, 4, 6], [1, 3, 5], [7, 7, 7], [7, 7, 7], [7, 7, 7]]
【问题讨论】:
【参考方案1】:要将事物添加到事物数组并生成新数组,请使用plusElement
:
val arr2 = arr1.plusElement(extra)
这不仅适用于数组,也适用于任何Iterable
s,即List
s、Set
s 等。
【讨论】:
【参考方案2】:你明白为什么你会得到这个结果吗? arrayOf(items)
创建一个包装这些项目的新数组,因此arrayOf(even, odd)
是一个包含两个数组的数组。然后创建另一个数组,包含该数组数组和另一个数组。您正在嵌套它们
Sweeper 的答案可能是您想要的,但是有很多方法可以组合集合、展平序列等。就像您可以做的一件事是使用 *
operator(“扩展运算符”)来“解包”你的数组,所以你得到的项目,而不是:
// unpack arr1 from an array of arrays, into just those arrays
// equivalent to arrayOf([2, 4, 6], [1, 3, 5], extra)
val arr2 = arrayOf(*arr1, extra)
print(arr2.contentDeepToString())
>> [[2, 4, 6], [1, 3, 5], [7, 7, 7]]
还有flatMap
、flatten
等 - 最佳选择取决于您在做什么!
当你说你想要这个时:
[2, 4, 6], [1, 3, 5], [7, 7, 7]
这只是一堆值,不包含在任何东西中,所以我们假设你想要这个:
[[2, 4, 6], [1, 3, 5], [7, 7, 7]]
它们保存在一个数组中(或者它可以是一个列表)。您可以使用扩展运算符将其解压缩成一堆值,但您所能做的就是将其作为可变数量的参数传递给函数(这就是 arrayOf
中发生的事情)
【讨论】:
伙计们感谢您的建议。这两个答案都添加到我的知识中。 # cactustictacs 你的问题是的,我想实现一个嵌套数组 [[2, 4, 6], [1, 3, 5], [7, 7, 7]],而不是使用和索引来选择一个数组列表。但是,在我的场景中,我使用 for 循环向该数组添加一个新列表,但它不像我预期的那样工作。 @PSoll 如果你有你的 container 数组(外部)和 item 数组([2, 4, 6]
等),那么你需要创建您的容器,可能从包含的几个项目开始 - arrayOf()
或 arrayOf(even, odd)
。然后只需添加项目数组(使用其他答案中的一种 plus 方法)是最简单的方法。 arr1 += extra
工作!
@PSoll 需要注意的一点是,Kotlin 鼓励 immutable 集合,因此有很多函数不会更改原始集合,它们使用更改,然后返回。 plusElement
是一,所以arr1.plusElement(extra)
不会改变arr1
,它只会生成一个添加的副本。无论如何,这对于数组都是必要的——它们是固定长度的,如果你想“添加”到一个,你需要创建一个新数组并将其分配给变量。您通常会改用 mutableList
- 如果出于某种原因您真的想要一个数组,您可以在最后调用 toTypedArray()
【参考方案3】:
我假设你想得到以下数组:
[[2, 4, 6], [1, 3, 5], [7, 7, 7]]
在 Kotlin 中有一个覆盖 +
(加号)运算符用于 Array
s,您可以使用它来添加数组:
val arr2 = arr1 + extra
结果数组 arr2
将包含原始数组 arr1
的所有元素,然后包含数组 extra
的所有元素。
另外:
您可以将另一个数组添加到arr2
:
val anotherArray = arrayOf(5, 5, 5)
val arr3 = arr2 + anotherArray
// result: [[2, 4, 6], [1, 3, 5], [7, 7, 7], [5, 5, 5]]
如果你想使用同一个数组arr2
来存储元素,你可以用var
修饰符创建它:
var arr2 = arr1 + extra
arr2 += arrayOf(5, 5, 5)
您尝试使用循环实现的目标有多种不同的方式,例如:
val even = arrayOf(2, 4, 6)
val odd = arrayOf(1, 3, 5)
val extra = arrayOf(7,7,7)
var arr1 = arrayOf(even, odd)
for (i in 1..3)
arr1 += extra
arr1
将包含下一个元素:[[2, 4, 6], [1, 3, 5], [7, 7, 7], [7, 7, 7], [7, 7, 7]]
【讨论】:
使用+
操作符你想得到什么结果?这应该可以工作,结果数组应该是[[2, 4, 6], [1, 3, 5], [7, 7, 7]]
。我猜你错误地描述了你想在你的问题中得到的结果。
Sergey 和@cactustictacs 绝对正确。该代码示例有效,但如果我尝试使用循环将其他数组添加到 arr2,它只会替换数组的最后一个元素。我没有尝试过 mutableList 但我认为在这种情况下这是正确的方法。所以这是我寻找的结果 [[2, 4, 6], [1, 3, 5], [7, 7, 7]] 并在我的循环之后向列表中添加一个额外的元素,如 [[2, 4 , 6], [1, 3, 5], [7, 7, 7], [5,5,5]] 等等。
@PSoll 我在回答中添加了一些附加信息。我不太明白您如何尝试在循环中添加元素,很高兴看到一些示例(您可以编辑您的问题)。
在这里找到代码:play.kotlinlang.org/…
所以你调用containerArray()
三次,每次都打印相同的结果。你想达到什么目的?以上是关于将数组列表附加到数组并在 kotlin 中重复此操作的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何创建一个空的numpy数组并附加到它,如列表[重复]