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)