Kotlin:遍历集合中的每一对(或通常固定大小的子集)
Kotlin: Iterate through every pair (or generally fixed-sized subsets) in collection
是否有 short/idiomatic 遍历集合中每一对元素的方法?
更好的方法是遍历集合的所有固定基数子集。
经典而丑陋的方法是:
val s = setOf(1, 2, 3, 4)
for (i in s) {
for (j in s) {
if (i != j) {
println("$i $j")
}
}
}
为了拥有更大的子集,需要更多的循环,因此这是不可扩展的。
如果找到幂集运算的实现,可以取幂集中长度为2的所有元素。
我认为您已经找到了最惯用的解决方法。如果你想让它更实用,你可以将它转换成:
s.map { i -> s.map { i to it } }
.flatten()
.filter { (left, right) -> left != right }
.onEach { (i, j) -> println("$i $j") }
这在技术上也是 O(n^2) 但迭代次数将少于一半:(n^2 - n) / 2
val l = s.toList()
for (i in s.indices) {
for (j in i + 1 until s.size) {
println("${l[i]}, ${l[j]}")
println("${l[j]}, ${l[i]}")
}
}
是否有 short/idiomatic 遍历集合中每一对元素的方法?
更好的方法是遍历集合的所有固定基数子集。
经典而丑陋的方法是:
val s = setOf(1, 2, 3, 4)
for (i in s) {
for (j in s) {
if (i != j) {
println("$i $j")
}
}
}
为了拥有更大的子集,需要更多的循环,因此这是不可扩展的。
如果找到幂集运算的实现,可以取幂集中长度为2的所有元素。
我认为您已经找到了最惯用的解决方法。如果你想让它更实用,你可以将它转换成:
s.map { i -> s.map { i to it } }
.flatten()
.filter { (left, right) -> left != right }
.onEach { (i, j) -> println("$i $j") }
这在技术上也是 O(n^2) 但迭代次数将少于一半:(n^2 - n) / 2
val l = s.toList()
for (i in s.indices) {
for (j in i + 1 until s.size) {
println("${l[i]}, ${l[j]}")
println("${l[j]}, ${l[i]}")
}
}