2017-10-03 9 views
0

2つのマップを比較しようとしていますが、どちらも同じ文字列で満たされています(トレーニング用)。 私はそれらを比較しようとすると、私はfalseを得たがmap.equals(map2)Kotlin:マップが等しい場合でもマップの比較に失敗する

を通じて返さしかし、私は同じことを行うとcomparison.toString()を追加する場合、それはtrueを返します。 map.toString().equals(map2.toString())

どのようにですか?私は間違って何をしていますか?

Kluent libraryとそのshouldEqualメソッドでも同じことが起こります。 mapsvaluesarraysに変換しようとしましたが、それを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 
}> 
+3

種類が異なります。それだけでも失敗する可能性があります。 toStringがクラスインジケータを捨て、文字列を表示するだけであれば、文字列の表現は等しくなります。 – Carcigenicate

+1

クラスの定義を教えてもらえますか?また、あなたが投稿した最初のコードブロックのマップ名は何とか混在しています。 – zsmb13

+0

@Carcigenicate @ zsmb13新しい投稿があります。また、私は2クラス 'Items2'を削除しましたが、それはまだ同じです。 – Viterzgir

答えて

2

equals方法で2つのマップを比較すると、標準の実装はequalsメソッドを使用しても、すべてのキーと値を比較するには。

Itemsクラスは標準equals実装を使用します(同じオブジェクトを参照する場合にのみ2つの参照値が等しくなります)。しかし、あなたは明らかに異なるマップに2つの異なるインスタンスを持っています。

あなたはどちらかItems#equalsメソッドをオーバーライドしたりdata classとしてItemsクラスをマークする必要があります。

data class Items(var name1: String, var amount1: String, var price1: String) 

Kotlinが正しいequalshashCodetoStringメソッドを生成します。

この後、マップの比較はうまく動作します。

+0

ありがとう!私は 'データクラス'を使用し、それは正常に働いた。 – Viterzgir

関連する問題