Scala для цикла доходности не обеспечивает ожидаемый результат

Следующий пример кода:

val deck = for {
  suit <- Suit.values
  rank <- Rank.values
} yield {
  println(s"$rank $suit")
  PlayingCard(suit, rank)
}
print(deck)

обеспечивает следующий вывод:

Эйс Хартс
Два очага
Три очага
Четыре очага
Пять очагов
Шесть очагов
Семь Очагов
Восемь очагов
Девять очагов
Десять очагов
Джек Хартс
Queen Hearths
Король Хартс
Ace Diamonds
Два бриллианта
Три бриллианта
Четыре бриллианта
Пять бриллиантов
Шесть Бриллиантов
Семь Бриллиантов
Восемь алмазов
Девять бриллиантов
Десять бриллиантов
Джек Даймондс
Королева бриллиантов
King Diamonds
Туз пики
Две пики
Три пики
Четыре пики
Пять пиков
Шесть пиков
Семь лопат
Восемь пиков
Девять пиков
Десять пиков
Джек пики
Пиковая дама
King Spades
Ace Clubs
Два Клуба
Три Клуба
Четыре Клуба
Пять клубов
Шесть клубов
Семь Клубов
Восемь клубов
Девять клубов
Десять клубов
Джек клубы
Queen Club
Королевские клубы

TreeSet(Туз Туз, Два Клуба, Три Клуба, Четыре Клуба, Пять Клубов, Шесть Клубов, Семь Клубов, Восемь Клубов, Девять Клубов, Десятка Клубов, Валет Клубов, Королева Клубов, Король треф)

Я абсолютно не знаю, почему этот код корректно перебирает все карты, но, кажется, только возвращает последнюю масть (будучи клубами)

1 ответ

Решение

Может быть, это потому, что вы строите TreeSet, но вы реализовали равенство для PlayingCard неправильно, поэтому отбрасывает элементы, которые вы хотите сохранить. Это произойдет, если PlayingCard.equals учитывает только ранг карты, игнорируя масть.

Если PlayingCard.equals был реализован так, что он игнорирует костюм, а затем всякий раз, когда вы добавляете туз любой масти к Set это удалит предыдущий туз. Это похоже на проблему, которую вы видите.

Чтобы это исправить, либо измените определение PlayingCard.equals рассмотреть иск или заставить другой тип коллекции, которая не заботится о равенстве, например Vector:

val deck = for {
  suit <- Suit.values.toVector
  rank <- Rank.values.toVector
} yield {
  println(s"$rank $suit")
  PlayingCard(suit, rank)
}
print(deck)
Другие вопросы по тегам