使用kotlin中的索引映射ArrayList的ArrayList



我有ArrayList<String>ArrayList

ArrayList<String>将具有相同大小的

我想创建新的ArrayList<ArrayList<String>>

例如:-

我有这个清单:-

[
["a", "1"],
["b", "1"],
["c", "1"]
]

我想要输出如下:-

[
["a", "b", "c"],
["1", "1", "1"]
]

这将处理任意大小和不均匀大小的列表。

策略:删除内部列表,同时为每个项目添加原始索引。按它们的原始索引对它们进行分组。最后,去掉索引。

val pivoted = lists.flatMap { it.withIndex() }
.groupBy { it.index }
.values.map { list -> list.map { it.value } }

控制台:

[[a, 1], [b, 2, β], [c, 3, γ]] // Input
[[a, b, c], [1, 2, 3], [β, γ]] // Output

更通用的方式,可以处理更长的内部列表。


@Test
fun `Test groupByIndexed`() {
val mapOfLists = arrayListOf(
arrayListOf("a", "1"),
arrayListOf("b", "2"),
arrayListOf("c", "3")
)
.asSequence()
.flatMap { it.asSequence() }
.groupByIndexed { idx, _ ->
idx % 2 // Use how many elements have each inner list
}
// Convert Map<List<String>> to desired ArrayList<ArrayList<String>>
val arrayListOfArrayLists = ArrayList<ArrayList<String>>()
mapOfLists
.asSequence()
.map {
ArrayList<String>().apply {
addAll(it.component2())
}
}
.toCollection(arrayListOfArrayLists)

Assertions.assertEquals(2, arrayListOfArrayLists.size)
Assertions.assertEquals(arrayListOf("a", "b", "c"), arrayListOfArrayLists[0])
Assertions.assertEquals(arrayListOf("1", "2", "3"), arrayListOfArrayLists[1])
}
private fun <T, K> Sequence<T>.groupByIndexed(keySelector: (Int, T) -> K): Map<K, List<T>> {
val data = LinkedHashMap<K, MutableList<T>>()
return foldIndexed(data) { idx, acc, str ->
val key = keySelector(idx, str)
val list = acc.getOrPut(key) { mutableListOf() }
list.add(str)
acc
}
}
@Test
fun rotate2dList() {
val old = listOf(
listOf("a", "1"),
listOf("b", "1"),
listOf("c", "1")
)
val N = old[0].size // determine size of new list
val new = old
.asSequence()
.flatMap { it.asSequence() }
.withIndex()
.groupBy { it.index % N }
.values
.map { it.map { it.value } }
assertEquals(N, new.size)
assertEquals(listOf("a", "b", "c"), new[0])
assertEquals(listOf("1", "1", "1"), new[1])
}

例如:

val lista = arrayListOf(
arrayListOf("a","1"),
arrayListOf("b", "1"),
arrayListOf("c","1")
)

val newList = ArrayList<ArrayList<String>>()
newList.add(
lista.map { it[0] }.toMutableList() as ArrayList<String>
)
newList.add(lista.map { it[1] }.toMutableList() as ArrayList<String>)
newList.forEach {
println(it)
}

输出:

[a, b, c]
[1, 1, 1]

最新更新