【问题标题】:Kotlin recursive function to compare two array and keep the content of origin arrayKotlin递归函数比较两个数组并保留原始数组的内容
【发布时间】:2019-10-18 20:36:23
【问题描述】:

我需要使用递归函数比较两个 MutableList,requiredDevices 和 providedDevices。这两个 MutableList 是一个 MutableList 的元素,originalArray 也是如此。如果有匹配,则将requiredDevices和providedDevices中匹配的元素一个一个取出,剩下的分别添加到list1和list2中。我怎样才能做到这一点并保留 requiredDevices 和 providedDevices 和 originalArray 的内容。例如:

originalArray=[requiredDevices, providedDevices]
           =[["A","B","C"],["B,"C","A","A","D"]]

requiredDevices=["A","B","C"]
providedDevices=["B,"C","A","A","D"]

,递归后:

list1=[] (empty array)
list2=["A","D"]

originalArray=[[],["A","D"]]

尝试编写递归函数并将 requiredDevices 和 providedDevices 作为参数。递归函数返回一个包含 list1 和 list2 的列表 temp。但是 requiredDevices 和 providedDevices 也被修改了。

val temp = mutableListOf<MutableList<String>>()
fun compareArray(requiredDevices: MutableList<String>, providedDevices: MutableList<String>): List<MutableList<String>> {

    for (i in 1 until requiredDevices.size) {
        for (j in 0 until providedDevices.size) {

            try {
                if (requiredDevices[i] == providedDevices[j]) {
                    requiredDevices.removeAt(i)
                    providedDevices.removeAt(j)

                    compareArray(requiredDevices, providedDevices)

                    temp.add(requiredDevices)
                    temp.add(providedDevices)
                }
            } catch (e: IndexOutOfBoundsException) {
            }
        }
    }

    return temp.distinct()
}

我想保留 originalArray 的内容,并且仍然得到 list1 和 list2 相同的结果。如下:

originalArray=[["A","B","C"],["B,"C","A","D"]]

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    我并没有真正遵循您的算法试图做什么。根据您的评论,我认为这可以解决问题。这会将两个起始列表复制到新列表中,然后从副本中逐一删除项目,因此如果有多余的项目,它们将保留它们。

    fun <T> removeCommonValues(listA: List<T>, listB: List<T>): Pair<List<T>, List<T>> {
        val outA = listA.toMutableList()
        val outB = listB.toMutableList()
        for (i in (outA.size - 1) downTo 0){
            for (j in (outB.size - 1) downTo 0){
                if (outA[i] == outB[j]){
                    outA.removeAt(i)
                    outB.removeAt(j)
                    break
                }
            }
        }
    
        return outA to outB
    }
    

    测试:

    fun main() {
        val required = listOf("A", "B", "C", "C")
        val available = listOf("B", "C", "A", "D", "D")
        println(removeCommonValues(required, available))
    }
    
    // Outputs ([C], [D, D])
    

    【讨论】:

    • 我没有使用过滤器,因为我想一个一个地取出匹配的元素。 listA 只有一个 A,但它可以取出 listB 中的所有 A。我要 1 A 只取出 1 A。
    • 查看编辑。我不明白所有的需求。您可以反复迭代交叉点,remove 一次只删除一个。
    • 非常感谢。一开始我以为我必须使用递归来解决它,这就是为什么我将它添加到问题的标题中。不知道不用它也能解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多