我有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]