Kotlin: Карты сравнения бросаются с ошибкой, даже если Карты равны

Я пытаюсь сравнить 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 .

После этого сопоставление карт будет работать нормально.

Intereting Posts
Как вы создаете многоплатформенную сборку Kotlin? В языке программирования Kotlin значение varargs с точки зрения использования Создание класса Parcelable со вторичным конструктором, который принимает список как параметр в Kotlin Kotlin определяет таймаут по запросу на сервер Отзыв Android Retrofit, если ключ не является строкой Невозможно объединить dex в 1.0.60 в android 3.0 при использовании facebook-login.aar Способы жизненного цикла в статически типизированных языках Почему этот код Котлина все еще требует?. для доступа к членам? Преобразование типов контейнеров? Являются ли числовые операции с использованием Kotlin столь же быстрыми, как эквивалент с Java-примитивами? kotlin работает с ресурсами (массив и параметр функции) Цикл бесконечности Котлина в списке в рекурсии В Котлине, какой идиоматический способ справиться с значениями NULL, ссылаться или преобразовывать их Dagger2 не работает в android Собственная собственность Котлина