Я пытаюсь сравнить 2 Карты, оба заполнены одинаковыми Строками (только для обучения). Когда я пытаюсь их сравнить, я получил false
через map.equals(map2)
Но если я сделаю то же самое и добавлю .toString()
к comparison
он вернет true
. map.toString().equals(map2.toString())
Как это? Что я делаю не так?
Также происходит то же самое с Kluent library
и ее методом shouldEqual
. Я также попытался получить values
этих maps
в arrays
и попытался сравнить эти arrays
но он все равно возвращает false
.
Кроме того, когда я печатаю все элементы с каждой карты, я вижу те же 3 строки, но результат сравнения fail
.
Вот код:
class MapsTesting { class Items(name1: String, amount1: String, price1: String) { var name: String = name1 var amount: String = amount1 var price: String = price1 override fun toString(): String { return "name:$name,amount:$amount,price:$price \n" } } @Test fun mapTest() { val mapOfItems: MutableMap<String, Items> = mutableMapOf() mapOfItems["Materials"] = Items("STEP 1", "STEP 2", "View All Stones") val mapOfItems2: MutableMap<String, Items> = mutableMapOf() mapOfItems2["Materials"] = Items("STEP 1", "STEP 2", "View All Stones") mapOfItems.forEach { t, u -> println("map key:$t,map value:${u.toString()}") } mapOfItems2.forEach { t, u -> println("map key:$t,map value:${u.toString()}") } val comparison : Boolean = mapOfItems.toString().equals(mapOfItems2.toString()) //this returns true val comparison2 : Boolean = mapOfItems.equals(mapOfItems2) //this returns false println(comparison) println(comparison2) val map1 = mapOfItems.toString() val map2 = mapOfItems2.toString() //this returns true //if I delete toString() it will return false map1 shouldEqual map2 } }
Вот ошибка, которую я получил:
java.lang.AssertionError: expected: java.util.LinkedHashMap<{Materials=name:STEP 1,amount:STEP 2,price:View All Stones }> but was: java.util.LinkedHashMap<{Materials=name:STEP 1,amount:STEP 2,price:View All Stones }>
При сравнении двух карт с методом equals
стандартная реализация сравнивает все ключи и значения, используя метод equals
.
Класс Items
использует стандартную equals
реализацию (два опорных значения равны тогда и только тогда, когда они относятся к одному и тому же объекту). Но у вас явно есть два разных экземпляра на разных картах.
Вы либо должны переопределить метод Items#equals
либо пометить класс Items
как data class
:
data class Items(var name1: String, var amount1: String, var price1: String)
Kotlin будет генерировать правильные методы equals
, hashCode
и toString
.
После этого сопоставление карт будет работать нормально.