如何在 Kotlin 中做到这一点?

gre*_*obo 1 immutability kotlin

我正在尝试为一个国家创建一个简单的数据类。

data class Country(val name: String, val capital: String)
Run Code Online (Sandbox Code Playgroud)

这很好用。现在我想添加邻居。

data class Country(val name: String, val capital: String, val neighbors: List<Country>)
Run Code Online (Sandbox Code Playgroud)

这会导致问题。加拿大和美国是邻居。我怎样才能干净地实例化每个国家对象?我不想让邻居元素可变。是否有可能做到这一点?(我首先尝试创建没有邻居的国家,然后使用复制构造函数创建有邻居的国家。但随后 equals 方法出现了问题。)这似乎是一个简单的问题,但我不确定如何解决。

小智 5

我认为你应该用 id 来表示邻居,然后创建一个函数来执行查询。这是我的解决方案

data class Country(
    val id : Int,
    val name: String,
    val capital: String,
    val neighbors: List<Int> = emptyList(),
){
    // Function to retrieve neighbors
    fun  getNeighbors(countries : List<Country>) : List<Country>{
        return  countries.filter { it.id in neighbors }
    }
}

val Togo = Country(id = 1, name = "TOGO", capital = "Lome", neighbors = listOf(2, 3, 4))
val Benin = Country(id = 2, name = "Benin", capital = "Porto Novo", neighbors = listOf(1))
val Ghana = Country(id = 3, name = "Ghana", capital = "Accra", neighbors = listOf(1, 2))
val Burkina = Country(id = 4, name = "Burkina Faso", capital = "Ouagadougou", neighbors = listOf(1, 2, 3))

val allCountries = listOf(Togo, Benin, Ghana, Burkina)

//Here you have the list of neighbors
val beninNeighbors = Benin.getNeighbors(allCountries)
Run Code Online (Sandbox Code Playgroud)