Сделайте копию многомерного массива поплавков - PullRequest
0 голосов
/ 11 апреля 2020

сегодня во время отладки моего приложения я обнаружил проблему в моем <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 равно <ArrayList<ArrayList<ArrayList<Float>>>

Как мне создать полный скопировать, чтобы новый ArrayList не указывал на исходный ArrayList?

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Вам не нужно копировать Floats, потому что они неизменны.

Вы можете использовать вложенные вызовы map для создания копий списков и переноса результатов в конструкторы ArrayList:

val normalizedAllData = ArrayList(allData.map { innerList ->
    ArrayList(innerList.map { ArrayList(it) })
})
0 голосов
/ 12 апреля 2020

Ну, я бы решил эту проблему следующим простым способом:

Я создам один вспомогательный метод:

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]
...