为什么扩展功能在ArrayList <ArrayList <Double >>上不起作用

时间:2019-10-29 10:58:42

标签: java android kotlin arraylist

我对Kotlin的Android开发非常陌生。我有一个由两个Double类型的ArrayList组成的ArrayList。我想放弃/切片大ArrayList中的第一个元素之后的所有内容。在遇到Kotlin页面上描述的here的属性时,我发现了一些函数,例如dropLasttake等。但是,它们在执行时不执行,也没有错误。我仍然得到与具有相同长度的输入相同的输出。尽管add列下的getFunctions之类的功能可以正常工作。我肯定在这里错过了一些东西。实现该目标的方式是什么?

下面是一个伪代码:-

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
}

3 个答案:

答案 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

中找到

这意味着它返回一个列表,它不会修改原始集合