de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Matt Higgins
Matt Higgins
Вопрос

Как элементы пересечения и соответствия scala в наборе

У меня есть два набора объектов, и я хочу получить пересечение двух множеств. Объекты в наборах выглядят так:

@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 2011-10-27T20:14:34+00:00 3
Программирование
scala
scala-collections
scala-2.9
mergeconflict
27-го октября 2011 в 8:40
2011-10-27T20:40:20+00:00
Дополнительно
Источник
Редактировать
#56792279

Я не на 100% уверен в этом, но я думаю, что ваша проблема вызвана тем, что внедрил собственный equals без соответствующего пользовательского hashCode . Я как бы удивлен, ваши хэш-наборы работают вообще, на самом деле ...

Конечно, ваша ручная петля через элементы каждого набора отлично работает, потому что вы вообще не вызываете hashCode :)

1
0
Daniel C. Sobral
27-го октября 2011 в 9:28
2011-10-27T21:28:04+00:00
Дополнительно
Источник
Редактировать
#56792280

Из 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
0
agilesteel
27-го октября 2011 в 8:36
2011-10-27T20:36:47+00:00
Дополнительно
Источник
Редактировать
#56792278

Когда переопределение equals всегда переопределяет hashCode с ним.

0
0
Похожие сообщества 3
Scala User Group
Scala User Group
2 434 пользователей
[RU] Scala Chat. Не поленитесь открыть, особенно если вы новичок https://github.com/scala-russian/about/blob/master/README.md
Открыть telegram
Scala Jobs
Scala Jobs
2 020 пользователей
Чтобы попасть в наш канал вакансий, необходимо указать в описании вакансии компанию, стек и вилку Канал вакансий: @scala_jobs_feed Флуд: @jobs_voprosiki Основной чат: @scala_ru README: https://bit.ly/3lnPbIo По вопросам рекламы обращаться: @aleksei_t
Открыть telegram
Scala Learning & Education: Ask for Review & Noob questions
Scala Learning & Education: Ask for Review & Noob questions
1 207 пользователей
Сборник ресурсов для изучения https://github.com/Odomontois/LearnScala Вам обязательно помогут, если ваш вопрос будет сопровождаться кодом в https://scastie.scala-lang.org
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 1 день назад
2
Hideo Nakagawa
Зарегистрирован 2 дня назад
3
Sergiy Tytarenko
Зарегистрирован 4 дня назад
4
shoxrux azadov
Зарегистрирован 6 дней назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией