android 按规则Kotlin合并两个列表

e3bfsja2  于 2023-03-21  发布在  Android
关注(0)|答案(1)|浏览(206)

我有两个列表,大致如下所示:

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() }
        }
      }
    }
  }
odopli94

odopli941#

这只是一个想法。
1.创建一个组合两个列表的列表:

val combinedList = localList.plus(remoteList)

1.对Map中的“相同ID”项进行分组-因此Map中的每个条目都是列表。

val mapOfIds = combinedList.groupBy { humanValue ->
    humanValue.id
}

1.“Map”的Mapvalyes和获得最大的游戏播放项目从该名单。

val finalList = mapOfIds.values.map { humanValuesForId ->
    humanValuesForId.maxByOrNull { it.gamesPlayed }
}

最终代码可能如下所示:

val finalList = localList
    .plus(remoteList)
    .groupBy { humanValue ->
        humanValue.id
    }
    .values
    .map { humanValuesForId ->
        humanValuesForId.maxByOrNull { it.gamesPlayed }
    }

相关问题