【问题标题】:Make the copy of multidimensional arraylist of floats制作浮点数的多维数组列表的副本
【发布时间】:2020-07-24 13:22:12
【问题描述】:

今天在调试我的应用时,我在<ArrayList<ArrayList<ArrayList<Float>>> 中发现了一个问题。

我的目标是制作该 ArrayList 的完整副本,因为现在当我更改 ArrayList 副本中的某些内容时,它也会更改原始 ArrayList。

所以我有这样的东西

            var first = ArrayList<ArrayList<ArrayList<Float>>>()
            var second = ArrayList<ArrayList<Float>>()
            var third = ArrayList<Float>()

            for(j in allData) {
                first.add(j.clone() as ArrayList<ArrayList<Float>>)
                for(k in j)
                {
                    second.add(k.clone() as ArrayList<Float>)
                    for(l in k)
                    {
                        third.add(l.toFloat())
                    }
                }
            }
            normalizedAllData = first.clone() as ArrayList<ArrayList<ArrayList<Float>>>

normalizedAllData&lt;ArrayList&lt;ArrayList&lt;ArrayList&lt;Float&gt;&gt;&gt;

我应该如何创建一个完整的副本以使新的 ArrayList 不会指向原始的 ArrayList?

感谢您的帮助

【问题讨论】:

    标签: android kotlin arraylist multidimensional-array copy


    【解决方案1】:

    好吧,我会用以下简单的方式解决这个问题:

    我将创建一个辅助方法:

    fun flattenList(nestedList: List<Any?>, flatList: MutableList<Any?>) {
        nestedList.forEach { e ->
            when (e) {
                !is List<Any?> -> flatList.add(e)
                else -> flattenList(e, flatList)
            }
        }
    }
    

    这就是我将如何使用此方法:

    // some sample list
    val nestedList = arrayListOf(arrayListOf(arrayListOf(1f, 2f, 3f, 4f)))
    
    // contain the flat list
    val flatList = mutableListOf<Any?>()
    
    flattenList(nestedList, flatList)
    
    println("Nested    : " + nestedList)
    println("Flat    : " + flatList)
    

    输出:

    Nested  : [[[1.0, 2.0, 3.0, 4.0]]]
    Flat    : [1.0, 2.0, 3.0, 4.0]
    

    您可以对任何类型使用 flattenList() 方法: 另一个示例:

    val nestedList = listOf(
            null,
            1f,
            listOf(2.0),
            listOf(listOf(3.0, 4), 5.0),
            listOf(listOf(listOf<String>("Hello Worlds"))),
            listOf(listOf(listOf(6), "seven")),
            "eight",
            listOf<Long>()
        )
    val flatList = mutableListOf<Any?>()
    
    flattenList(nestedList, flatList)
    
    println("Nested    : " + nestedList)
    println("Flat    : " + flatList)
    

    输出:

    Nested  : [null, 1.0, [2.0], [[3.0, 4], 5.0], [[[Hello Worlds]]], [[[6], seven]], eight, []]
    Flat    : [null, 1.0, 2.0, 3.0, 4, 5.0, Hello Worlds, 6, seven, eight]
    

    【讨论】:

      【解决方案2】:

      您不需要复制Floats,因为它们是不可变的。

      您可以使用嵌套的map 调用来创建列表的副本,并将结果包装在ArrayList 构造函数中:

      val normalizedAllData = ArrayList(allData.map { innerList ->
          ArrayList(innerList.map { ArrayList(it) })
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-18
        • 2018-11-30
        • 2011-09-25
        • 1970-01-01
        • 2017-10-06
        • 2019-01-10
        • 2019-11-16
        • 1970-01-01
        相关资源
        最近更新 更多