2つのマップを比較しようとしていますが、どちらも同じ文字列で満たされています(トレーニング用)。 私はそれらを比較しようとすると、私はfalse
を得たがmap.equals(map2)
Kotlin:マップが等しい場合でもマップの比較に失敗する
を通じて返さしかし、私は同じことを行うとcomparison
に.toString()
を追加する場合、それはtrue
を返します。 map.toString().equals(map2.toString())
どのようにですか?私は間違って何をしていますか?
Kluent library
とそのshouldEqual
メソッドでも同じことが起こります。 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
}>
種類が異なります。それだけでも失敗する可能性があります。 toStringがクラスインジケータを捨て、文字列を表示するだけであれば、文字列の表現は等しくなります。 – Carcigenicate
クラスの定義を教えてもらえますか?また、あなたが投稿した最初のコードブロックのマップ名は何とか混在しています。 – zsmb13
@Carcigenicate @ zsmb13新しい投稿があります。また、私は2クラス 'Items2'を削除しましたが、それはまだ同じです。 – Viterzgir