为了账号安全,请及时绑定邮箱和手机立即绑定

为什么扩展函数不适用于 ArrayList<ArrayList<Double>>

为什么扩展函数不适用于 ArrayList<ArrayList<Double>>

眼眸繁星 2024-01-05 17:06:10
我对 Kotlin 的 Android 开发非常陌生。我有一个 ArrayList,由两个 Double 类型的 ArrayList 组成。我想丢弃/切片 Big ArrayList 中第一个元素之后的所有内容。在遇到Kotlin 页面上描述的属性时,我发现了一些函数,例如等dropLast。take但是,它们在实现上不执行,也没有错误。我仍然得到与具有相同长度的输入相同的输出。add尽管, getunder column等功能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}
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

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>>回复


查看完整回答
反对 回复 2024-01-05
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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



查看完整回答
反对 回复 2024-01-05
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

要添加其他答案已经说过的内容,请从包含此方法的实际类中添加:


采取方法:


/**

 * 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


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


查看完整回答
反对 回复 2024-01-05
  • 3 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信