Hussain
Hussain

Reputation: 1345

Pair items in a list with one another in Kotlin

I want to pair items in a list with one another

Example

list("A","B","C") to -> list(Pair(A,B),Pair(A,C),Pair(B,C))

list("A","B","C","D") to -> list(Pair(A,B),Pair(A,C),Pair(A,D),Pair(B,C),Pair(B,D),Pair(C,D))

I have tried using zipWithNext, but it does not help my cause. If anyone can show me how I can achieve this?

Upvotes: 4

Views: 2351

Answers (3)

Thiago
Thiago

Reputation: 13302

If you were looking for a Pair chaining here is how to do it:

fun main() {

    val a = listOf("A", "B", "C", "D")
    val listPair: MutableList<Pair<String, String>> = mutableListOf()

    a.forEachIndexed{ index, _ -> 
            if (index != a.size - 1) {
                val pair = Pair(a.get(index), a.get(index + 1))
                listPair.add(pair)
            }
        }

    println(listPair)
}

Result: [(A, B), (B, C), (C, D)]

Upvotes: 0

Leonidos
Leonidos

Reputation: 10518

kotlin way )

var a = listOf("A", "B", "C", "D")

var pairs = a.mapIndexed { index, s ->
        a.slice(index + 1 until a.size).map { Pair(s, it)}
}.flatten()


print(pairs)

Upvotes: 2

deHaar
deHaar

Reputation: 18578

You can simply nest for loops and use ranges for that:

fun permute(list: List<String>): List<Pair<String, String>> {
    var result: MutableList<Pair<String, String>> = mutableListOf()

    for (i in 0..(list.size - 1)) {
        val s = list.get(i)

        for (j in (i + 1)..(list.size - 1)) {
            val p = Pair(s, list.get(j))
            result.add(p)
        }
    }

    return result
}

There might be ways that are more Kotlin style, but I don't know one at the moment...

Using this method in a fun main() like this

fun main() {
    val list = listOf("A", "B", "C", "D")

    println(permute(list))
}

will output

[(A, B), (A, C), (A, D), (B, C), (B, D), (C, D)]

Upvotes: 5

Related Questions