スカラ交点と集合内の要素とのマッチング

私は2組のオブジェクトを持っており、2組のオブジェクトの交点を取得したい。セット内のオブジェクトは次のようになります

@BeanInfo
class User {

  @JsonProperty
  @BeanProperty
  var name:String = ""

  @JsonProperty
  @BeanProperty
  var id:Long = 0

  override def toString = name

  override def equals(other: Any)= other match {
      case other:User => other.id == this.id
      case _ => false
   }

}

別のクラスで私はユーザーのセットを取得し、交差点を見たい。

val myFriends = friendService.getFriends("me")
val friendsFriends = friendService.getFriends("otheruser")
println(myFriends & friendsFriends) 

上記のコードは機能せず、印刷します

Set()

しかし、手動でforeachを使用してセットをループすると、私は望ましい結果を得ます

var matchedFriends:scala.collection.mutable.Set[User] = new HashSet[User]()    
myFriends.foreach(myFriend => {
  friendsFriends.foreach(myFriend => {
      if(myFriend == myFriend){
        matchedFriends.add(myFriend)
      }
  })
})
println(matchedFriends)

上記のコードは、

Set(Matt, Cass, Joe, Erin)

これはうまく動作します

val set1 = Set(1, 2, 3, 4)
val set2 = Set(4,5,6,7,1)

println(set1 & set2)

上記のプリント

Set(1, 4)

Do the set operations & &- etc.. only work on primitive objects ? Do I have to do something additional to my user object for this to work ?

0
myFriend == myFriend 本当ですか?
追加された 著者 agilesteel,

3 答え

JavaDocから:

一般に、hashCodeメソッドをオーバーライドする必要があることに注意してください   このメソッドがオーバーライドされるたびに、一般的な   hashCodeメソッドのコントラクト。等しいオブジェクトは   等しいハッシュコードを持つ

ScalaDocから:

また、このメソッドをオーバーライドするときには、通常、   hashCodeをオーバーライドして、 "等しい"   (o1.equals(o2)はtrueを返します)hashは同じIntになります。   (o1.hashCode.equals(o2.hashCode))。

Set is not working because you broke hashCode when you overrode equals.

1
追加された

私はこれについて100%肯定的ではありませんが、問題は、対応するカスタム hashCode なしのカスタム equals を実装したことに起因すると思います。私はあなたのハッシュセットがまったく動いているのに驚きました...

hashCode を呼び出さないため、各セットの要素を通る手動ループはうまくいきます。

1
追加された
ハッシュコードを追加しましたが、mergeconflictに感謝しましたが、興味のあるdefがあれば、不変性に悩まされていないより多くのscalaバージョンの交差点を処理する前に、[A](set:Set [A]、target:A):Boolean = {set.foldLeft(false){(rv、item)=> rv || {A}(set [A]、set2:Set [A]):[A] = {set1.foldLeft(Set [A]()){(ユニオン、アイテム) => {if(has(set2、item))union + item else union}}}
追加された 著者 Matt Higgins,

equals をオーバーライドすると常に hashCode がオーバーライドされます。

0
追加された