我有两个列表,大致如下所示:
val localList = listOf(
HumanValue(id = "abc", gamesPlayed=7, gamesWon=4, removed=false),
HumanValue(id = "abcd", gamesPlayed=1, gamesWon=0, removed=false),
HumanValue(id = "abcde", gamesPlayed=6, gamesWon=3, removed=false),
HumanValue(id = "abcdef", gamesPlayed=12, gamesWon=12, removed=false)
)
val remoteList = listOf(
HumanValue(id = "abc", gamesPlayed=12, gamesWon=7, removed=false),
HumanValue(id = "abcd", gamesPlayed=1, gamesWon=0, removed=false),
HumanValue(id = "abcde", gamesPlayed=6, gamesWon=3, removed=true),
HumanValue(id = "abcdef", gamesPlayed=12, gamesWon=12, removed=false),
HumanValue(id = "abcdefg", gamesPlayed=0, gamesWon=0, removed=false)
)
我想要的是最新的列表成为规范列表,所以游戏数量最多的项目将是最新的,因此是规范的。每个项目的默认状态也是它还没有被删除,所以如果它已经被删除,这是故意的,因此是规范的。
我可以用forEach遍历更长列表中的每一个,然后将游戏播放次数最多的列表添加到第三个列表,然后将这些列表中的每一个都设置到第三个列表,但这感觉不是最佳实践/习惯用法/高效等。
有没有其他的方法可以做到这一点,例如使用Kotlin方法,如mapping或flatmapping或其他方法?
编辑:这是我想到的最好的方法,但在我看来却很糟糕:
suspend fun compareDBs() {
if ((localDeck.value?.size == remoteDeck.value?.size) && (localDeck.value?.toSet() == remoteDeck.value?.toSet())) { return }
else {
val diff1: MutableList<HumanValue> = mutableListOf(localDeck.value?.minus(arrayOf(remoteDeck).toSet())) as MutableList<HumanValue>
val diff2 = remoteDeck.value?.minus(arrayOf(localDeck).toSet()) as MutableList<HumanValue>
val listOfDifferences = mutableListOf<HumanValue>()
listOfDifferences.addAll(diff1)
listOfDifferences.addAll(diff2)
listOfDifferences.forEach {diffValue ->
val localVersion = localDeck.value?.filter { it.id == diffValue.id }
val remoteVersion = remoteDeck.value?.filter { it.id == diffValue.id }
if (!localVersion.isNullOrEmpty() && !remoteVersion.isNullOrEmpty()) {
if (localVersion[0].gamesPlayed > remoteVersion[0].gamesPlayed) { localIsCanonical() }
else { remoteIsCanonical() }
}
else {
if (localVersion.isNullOrEmpty()) { remoteIsCanonical() }
else if (remoteVersion.isNullOrEmpty()) { localIsCanonical() }
}
}
}
}
1条答案
按热度按时间odopli941#
这只是一个想法。
1.创建一个组合两个列表的列表:
1.对Map中的“相同ID”项进行分组-因此Map中的每个条目都是列表。
1.“Map”的Mapvalyes和获得最大的游戏播放项目从该名单。
最终代码可能如下所示: