首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在第二个列表中查找丢失对象的更好方法,然后使用Kotlin添加它。

在第二个列表中查找丢失对象的更好方法,然后使用Kotlin添加它。
EN

Stack Overflow用户
提问于 2020-09-30 20:02:41
回答 1查看 398关注 0票数 3

我有两个列表,一个来自本地DB,另一个来自JSON云查询。问题是由于遗留代码,云中的设备必须映射到存储在DB上的本地类型。(这个客户不是我做的)。因此,在某个时候,我们添加了一个新的对象,它总是来自本地。由于时间问题和我们现在无法触及的糟糕的RXJava编程,我们想要检查它是否存储在云中。如果不是,那么我们将该对象添加到云对象列表中,并发送更新。我们必须发送整个名单,而不仅仅是新的,再次客户决定的那一个。所以这里有一个更干净的方法,我尝试过使用过滤器,filterNot,但是这似乎适用于所有的测试用例:

代码语言:javascript
运行
复制
val tempList = convertLocalObjectToCloud(Id, localObjectsList)
val differences: MutableList<CloudObject> = mutableListOf()

tempList.forEach {localObject->
    val found = cloudList.find {
        localObject.Id == it.Id
    }

    if (found == null) {
        differences.add(localObject)
    }
}

// add to list only items not found
cloudList += differences  

必须对所有七个测试用例都有效,

  1. 两个列表都是空的-- cloudList没有更改
  2. 本地列表空- cloudList没有更改
  3. 本地列表和云列表相同-- cloudList无更改
  4. 云列表空- cloudList添加了来自本地

H 110本地列表中的所有设备的项目比云多- cloudList只向其列表中添加了这些项<代码>H 211<代码>H 112云列表中有更多的项目,但是在云中重复的项目更少,但是在云中重复的所有更改(稍后删除)<代码>H 213<代码>H 114云和本地列表中有不同的大小,一些来自本地的项目在云中丢失,一些来自本地的云丢失-cloudList只添加那些稍后会出现的本地has...delete的缺失。

我用函数代码的要点编写了一个快速的JUnit测试用例。

代码语言:javascript
运行
复制
class AddFromLocalDBToCloudTest {
    val localList: MutableList<Quijibo> = mutableListOf()
    val cloudList: MutableList<Quijibo> = mutableListOf()

    fun FindMissingObjects() {
        val differences: MutableList<Quijibo> = mutableListOf()

        localList.forEach { localObject->
            val found = cloudList.find {
                localObject.Id == it.Id
            }

            if (found == null) {
                differences.add(localObject)
            }
        }

        // add to list only items not found
        cloudList += differences
    }

    @Before
    fun setup() {
        localList.add(Quijibo(1, "name 1"))
        localList.add(Quijibo(2, "name 2"))
        localList.add(Quijibo(3, "name 3"))
        localList.add(Quijibo(4, "name 4"))

        cloudList.add(Quijibo(1, "name 1"))
        cloudList.add(Quijibo(2, "name 2"))
        cloudList.add(Quijibo(4, "name 4"))
    }

    @Test
    fun `1 Added Missing in Cloud`() {
        FindMissingObjects()
        assertEquals(4, cloudList.size)
    }

    @Test
    fun `2 Same in Cloud`() {
        cloudList.add(Quijibo(3, "name 3"))
        FindMissingObjects()
        assertEquals(4, cloudList.size)
    }

    @Test
    fun `3 Empty in Local DB`() {
        localList.clear()
        FindMissingObjects()
        assertEquals(3, cloudList.size)
    }

    @Test
    fun `4 Empty in both Lists`() {
        localList.clear()
        cloudList.clear()
        FindMissingObjects()
        assertEquals(0, cloudList.size)
    }

    @Test
    fun `5 Empty in Cloud`() {
        cloudList.clear()
        FindMissingObjects()
        assertEquals(4, cloudList.size)
    }

    @Test
    fun `6 More in Cloud but slightly different in both`() {  // could happen...edge case
        localList.removeAt(3)
        localList.removeAt(0)
        FindMissingObjects()
        assertEquals(4, cloudList.size)
    }

}

data class Quijibo(var Id: Int, var name: String)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 16:31:56

您可以通过使用filter来做到这一点。下面的代码只保存来自tempList的元素,对于这些元素,cloudList的所有元素都有不同的id,即,已经不在cloudList中的元素,然后将这些元素添加到cloudList中。

代码语言:javascript
运行
复制
cloudList += tempList.filter{ localObject -> 
  cloudList.all{ it.id != localObject.id }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64144913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档