Kotlin在两个数组之间交换元素WRT To Object字段

Kotlin在两个数组之间交换元素WRT To Object字段,kotlin,Kotlin,我有两个包含自定义对象的ArrayList: class MediaData(val path: String,val durationMs: Int) 由于内部的复杂情况与这个问题无关,我需要交换共享同一路径的两个ArrayList的元素。例如: 互换前 互换后: 注意:查看对象引用以了解差异 有没有捷径可以做到这一点?我认为没有内置的捷径可以做到这一点。您可以编写如下函数: fun <T> swapMatchingElements(list1: MutableList<T

我有两个包含自定义对象的ArrayList:

class MediaData(val path: String,val durationMs: Int)
由于内部的复杂情况与这个问题无关,我需要交换共享同一路径的两个ArrayList的元素。例如:

互换前

互换后:

注意:查看对象引用以了解差异


有没有捷径可以做到这一点?

我认为没有内置的捷径可以做到这一点。您可以编写如下函数:

fun <T> swapMatchingElements(list1: MutableList<T>, list2: MutableList<T>, predicate: (T) -> Boolean): Boolean {
    val index1 = list1.indexOfFirst(predicate)
    if (index1 < 0)
        return false
    val index2 = list2.indexOfFirst(predicate)
    if (index2 < 0)
        return false
    list1[index1] = list2[index2].also { list2[index2] = list1[index1] }
    return true
}
ArrayList1:
object 1 - path : x, reference:0x13as2
object 2 - path : y, reference:0x11ad4

ArrayList2:
object 1 - path : x, reference:0x12e2e
object 2 - path : z, reference:0x14ed4
fun <T> swapMatchingElements(list1: MutableList<T>, list2: MutableList<T>, predicate: (T) -> Boolean): Boolean {
    val index1 = list1.indexOfFirst(predicate)
    if (index1 < 0)
        return false
    val index2 = list2.indexOfFirst(predicate)
    if (index2 < 0)
        return false
    list1[index1] = list2[index2].also { list2[index2] = list1[index1] }
    return true
}
swapMatchingElements(list1, list2) { it.path == "x" }