是否有一种方法来合并两个列表?


val current = listOf(
Item(0, "url_0", "content_0"),
Item(1, "url_1", "content_1"),
Item(2, "url_2", "content_2"),
Item(3, "url_3", "content_3"),
Item(4, "url_4", "content_4"),
Item(5, "url_5", "content_5")
)
val contentModify = listOf(
Item(0, "url_0", "content_0"),
Item(1, "url_1", "content_1"),
Item(2, "url_2", "content_20"), // modify
Item(3, "url_3", "content_30"), // modify
Item(4, "url_4", "content_40"), // modify
Item(5, "url_5", "content_5")
)
val urlModify = listOf(
Item(0, "url_0", "content_0"),
Item(1, "url_1", "content_1"),
Item(2, "url_2", "content_2"),
Item(3, "url_3", "content_3"),
Item(4, "url_40", "content_4"), // modify
Item(5, "url_50", "content_5") // modify
)
val content = current.filterNot(contentModify::contains)
val url = current.filterNot(urlModify::contains)

我制作了[content], [url],通过对比[contentModify]和[urlModify]在不同地方的修改,找到[current]的变化点。我想结合两个结果,使一个编辑列表,但我想知道是否有一种方法来合并它们,如果Id值是相同的。在kotlin中是否有办法将这两个结果结合起来?

我不明白最终列表应该包含什么元素…

如果您想要一个包含所有已更改(但使用旧值)的项的列表,简单的方法是使用set:(url + content).toSet()该指令生成一个包含以下项的集合:

  • 项目(2,"url_2","content_2")
  • 项目(3"url_3","content_3")
  • 项目(4,"url_4","content_4")
  • 项目(5"url_5","content_5")

但是这个列表不包含更新的数据,所以我想你想要下面的列表:

  • 项目(2,"url_2","content_20")
  • 项目(3"url_3","content_30")
  • 项目(4,"url_40","content_40")
  • 项目(5"url_50","content_5")

对于这个,没有任何内置函数,所以你应该实现如下:

// your version of content and url are sublists of current but 
// you need the updated items (from contentModify and urlModify)
val content = contentModify.filterNot(current::contains)
val url = urlModify.filterNot(current::contains)
val mergedList = (content + url)
.groupBy{it.id}
.values
.flatMap{ items -> 
sequenceOf(if(items.size == 2){Item(items[0].id, items[0].content, items[1].url)} else {items.first()})
}

最新更新