Kotlin:即使地图是平等的,地图比较抛出也会失败
我试图比较2个地图,两个填充相同的字符串(仅用于培训)。 当我尝试比较它们时,我通过map.equals(map2)
返回false
但是,如果我这样做,并将.toString()
添加到comparison
它返回true
。 map.toString().equals(map2.toString())
怎么样? 我究竟做错了什么?
Kluent library
及其shouldEqual
方法Kluent library
发生同样的情况。 我也尝试将该maps
values
存入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
方法比较所有的键和值。
Your Items
类使用标准的equals
实现(当且仅当引用同一个对象时,两个引用值相等)。 但是,在不同的地图中显然有两个不同的实例。
您必须重写Items#equals
方法或将Items
类标记为data class
:
data class Items(var name1: String, var amount1: String, var price1: String)
Kotlin会生成正确的equals
, hashCode
和toString
方法。
在此之后,地图比较将正常工作。