这可能是一个天真的问题。我有一个案例类“书”,定义如下:理解scala中的列表/集合
case class Book(title : String, authors : List[String])
在我的主要方法,我定义了几本书记录如下:
val books = List(
Book(title = "Book1", authors = List("Author1", "Author2")),
Book(title = "Book2", authors = List("Author3", "Author4")),
Book(title = "Book3", authors = List("Author2", "Author5")),
Book(title = "Book4", authors = List("Author6", "Author3")),
Book(title = "Book5", authors = List("Author7", "Author8")),
Book(title = "Book6", authors = List("Author5", "Author9"))
)
我写一个查询检索的名字作家谁已撰写多本书籍,以及我的查询如下:
val authorsWithMoreThanTwoBooks =
(for {
b1 <- books
b2 <- books
if b1.title != b2.title
a1 <- b1.authors
a2 <- b2.authors
if a1 == a2
} yield a1)
println(authorsWithMoreThanTwoBooks)
这将打印List(Author2, Author3, Author2, Author5, Author3, Author5)
(两次出现的作者这是相当期待的名字,因为每对图书将TA ken两次,如(b1,b2)和(b2,b1))。
当然,我可以用distinct
来解决这个问题,但另一种方式是创建一个列表中未记录,但在设置:
val books = Set(
Book(title = "Book1", authors = List("Author1", "Author2")),
Book(title = "Book2", authors = List("Author3", "Author4")),
Book(title = "Book3", authors = List("Author2", "Author5")),
Book(title = "Book4", authors = List("Author6", "Author3")),
Book(title = "Book5", authors = List("Author7", "Author8")),
Book(title = "Book6", authors = List("Author5", "Author9"))
)
for
表达和println
:Set(Author5, Author2, Author3)
为什么会发生这种行为?为什么Set
上的for
表达式会生成另一个Set
而不是List
?如果有需要的话,是否有可能获得相关作者的List
重复值?
如何设置可以包含重复? – Nyavro
他们不能,那就是我的意思。我错过了什么吗? –
我的问题是,为什么我们从'books'的后一个定义中的for表达式获取Set,而不是List。相应地更新我的问题。 –