Haaris Iqubal
Haaris Iqubal

Reputation: 33

How to merge two different classes data into one in Kotlin

I have use two different classes:

ListTitle.kt

class ListTitle {
    var id: Int? = null
    var title: String? = null

    constructor(id:Int, title: String) {
        this.id = id
        this.title = title
    }
}

ListDes.kt

class ListDes {
    var address: Int? = null
    var des: String? = null

    constructor(address: Int, des: String) {
        this.address = address
        this.des = des
    }
}

listOfTitle and listDes are ArrayLists:

listOfTitle.add(ListTitle(1, "Hello"))
listOfTitle.add(ListTitle(2, "World"))

listDes.add(ListDes(1, "World Des"))
listDes.add(ListDes(2, "Hello Des"))

I want to assign title of ListTitle to des of ListDes by matching them by id/address for each element of the two lists.

How can I approach this?

Upvotes: 0

Views: 3983

Answers (2)

Willi Mentzel
Willi Mentzel

Reputation: 29844

You can use zip to merge two lists into one which has Pairs as elements.

val listOfTitle = listOf(ListTitle(1, "Hello"), ListTitle(2, "World"))
val listDes = listOf(ListDes(1, "World Des"), ListDes(2, "Hello Des"))

val pairList = listOfTitle.zip(listDes)

// since an element in the new list is a pair, we can use destructuring declaration 
pairList.forEach { (title, des) ->
    println("${title.title} ${des.des}")
}

Output:

Hello World Des
World Hello Des

A few notes:

You can write your classes in a shorter form in Kotlin. Just put the properties directly in the argument list of the primary constructor like shown below.

class ListTitle(
   var id: Int? = null,
   var title: String? = null
)

class ListDes(
    var address: Int? = null,
    var des: String? = null
)
  • Don't overuse nullability (using Int? instead of Int for instance). Make properties only nullable if necessary. If you always pass in arguments for the specified properties there is not need for them to be nullable.

  • Maybe you should choose other names for the classes (without "List" in it) since they are actually elements of a List in your example and not lists themselves.

Upvotes: 3

forpas
forpas

Reputation: 164099

If you just want to print the values you could do this:

listOfTitle.forEach {
    val id = it.id
    println(it.title + " " + listDes.filter { it.address == id }[0].des)
}

will print the matching des for each id:

Hello World Des
World Hello Des

The above code is supposed to work when both lists have the same length and there is always a matching des for each id

if you want to create a new list with the matching pairs:

val newList = listOfTitle.map { it ->
    val id = it.id
    Pair(it.title, listDes.filter { it.address == id }[0].des)
}

newList.forEach { println(it.first + " " + it.second) }

Upvotes: 0

Related Questions