我对Kotlin的Android开发非常陌生。我有一个由两个Double类型的ArrayList组成的ArrayList。我想放弃/切片大ArrayList中的第一个元素之后的所有内容。在遇到Kotlin页面上描述的here的属性时,我发现了一些函数,例如dropLast
,take
等。但是,它们在执行时不执行,也没有错误。我仍然得到与具有相同长度的输入相同的输出。尽管add
列下的get
,Functions
之类的功能可以正常工作。我肯定在这里错过了一些东西。实现该目标的方式是什么?
下面是一个伪代码:-
fun padding(tokenizedinput : ArrayList<ArrayList<Double>>) : ArrayList<ArrayList<Double>> {
var temp_storage = tokenizedinput // of size 2
temp_storage.take(1) // OPTION 1. Only want to have first element in this ArrayList
temp_storage.dropLast(1) // OPTION 2. Only want to drop 1 element from the end
println("FInal size: "+ temp_storage.size) //still size 2. Why not 1!?
return temp_storage
}
答案 0 :(得分:3)
temp_storage.take(1)
这将返回修订的List
。它不会修改您在其上调用的List
。您将忽略返回的值。
temp_storage.dropLast(1)
相同-您忽略了该函数正在执行的工作。
println("FInal size: "+ temp_storage.size) //still size 2. Why not 1!?
它的大小相同,因为您所做的任何修改都没有。
实现此目标的方法是什么?
如果我了解您的需求,请使用:
fun padding(tokenizedinput : ArrayList<ArrayList<Double>>) = arrayListOf(tokenizedinput[0])
在这里,我们:
获取tokenizedinput的第一个元素
将其包装在ArrayList
中,因为您希望得到ArrayList<ArrayList<Double>>
响应
答案 1 :(得分:2)
List.take(n)
或List.dropLast(n)
将return
包含该操作的新列表。它将不修改现有列表。尝试以这种方式记录或打印:-
println(temp_storage.take(1).size) // would be 1
println(temp_storage.dropLast(1).size) // would be 1
如果列表的大小为
1
,则上述输出为2
要转换为现有列表,请使用:-
temp_storage = ArrayList(temp_storage.dropLast(1)) // need to cast it to ArrayList<T> before assigning
答案 2 :(得分:1)
在包含该方法的实际类中添加其他答案已经说过的内容:
采用方法:
/**
* Returns a list containing first [n] elements.
*
* @throws IllegalArgumentException if [n] is negative.
*
* @sample samples.collections.Collections.Transformations.take
*/
public fun <T> Iterable<T>.take(n: Int): List<T> {
require(n >= 0) { "Requested element count $n is less than zero." }
if (n == 0) return emptyList()
if (this is Collection<T>) {
if (n >= size) return toList()
if (n == 1) return listOf(first())
}
var count = 0
val list = ArrayList<T>(n)
for (item in this) {
if (count++ == n)
break
list.add(item)
}
return list.optimizeReadOnlyList()
}
,以及 dropLast :
/**
* Returns a list containing all elements except last [n] elements.
*
* @throws IllegalArgumentException if [n] is negative.
*
* @sample samples.collections.Collections.Transformations.drop
*/
public fun <T> List<T>.dropLast(n: Int): List<T> {
require(n >= 0) { "Requested element count $n is less than zero." }
return take((size - n).coerceAtLeast(0))
}
可以在_Collections.kt
这意味着它返回一个列表,它不会修改原始集合