Scala 将列表划分为两个以上的分区
我有一份清单:Scala 将列表划分为两个以上的分区,scala,scala-collections,Scala,Scala Collections,我有一份清单: val list1 = List("male:Adam", "male:Peter", "female:Jane", "female:Sue", "female:Jo", "other:John") 我想创建两个列表,一个是女性姓名,一个是男性姓名。 i、 e: 我和你一起做的 val result = list1.groupBy(_.startsWith("male")) 因此,result将两个列表映射到true和false上,但每个元素都是“male:Adam”等。但是
val list1 = List("male:Adam", "male:Peter", "female:Jane", "female:Sue", "female:Jo", "other:John")
我想创建两个列表,一个是女性姓名,一个是男性姓名。
i、 e:
我和你一起做的
val result = list1.groupBy(_.startsWith("male"))
因此,result
将两个列表映射到true
和false
上,但每个元素都是“male:Adam”
等。但是我必须循环遍历每个列表,删除male:
和female:
字符串。这有点不起作用
有人能说明如何用功能性的方法解决上述问题吗?使用map函数
result(true).map(_.split(":")(1))
使用映射函数,如
result(true).map(_.split(":")(1))
你在乎“其他人:约翰”吗?它应该出现在这两个列表中的任何一个,或者在第三个列表中,或者被丢弃?不,或者在第三个列表中,或者被丢弃。你在乎“其他:约翰”吗?它是否应该进入这两个列表中的任何一个,或者在第三个列表中,或者被丢弃?否。在第三个列表中,或者被丢弃。
result(false)。map(u.split(“:”)(1))
返回列表(Jane,Sue,Jo,John)
John不应该在列表中。正是因为这些小怪癖,我才有这个问题。我尝试了list1.groupBy(u.startsWith(“男”)| | 124; u.startsWith(“女”))
,但第二次使用u
时抛出了一个缺少的参数错误,这首先让我感到困惑(因此这篇文章的标题):@AdamDavies:.foo
只是s=>s.foo
的简写,但是,如果要多次使用该参数,则不能使用速记符号。在您的示例中,它必须是s=>s.startsWith(“男性”)| | s.startsWith(“女性”)
。您的问题中没有“第二次使用|”,因此我更改了标题。看来你的问题并不是真的那么回事,反正result(false)。map(u.split(“:”)(1))
返回List(Jane,Sue,Jo,John)
John不应该在列表中。正是因为这些小怪癖,我才有这个问题。我尝试了list1.groupBy(u.startsWith(“男”)| | 124; u.startsWith(“女”))
,但第二次使用u
时抛出了一个缺少的参数错误,这首先让我感到困惑(因此这篇文章的标题):@AdamDavies:.foo
只是s=>s.foo
的简写,但是,如果要多次使用该参数,则不能使用速记符号。在您的示例中,它必须是s=>s.startsWith(“男性”)| | s.startsWith(“女性”)
。您的问题中没有“第二次使用|”,因此我更改了标题。看来你的问题并不是关于这一点,不管怎样,模式匹配的良好使用为更安全的阵列访问,+1提供了这一点!!你能推荐一些可以学习这种风格的书吗?@AdamDavies任何关于Scala的书都可以。您还可以仔细查看Scala Collections API提供的所有函数(,…),我喜欢这个答案和模式匹配的使用。我不确定我是否理解,但这是有趣的部分…干得好!感谢您出色地使用了模式匹配以实现更安全的阵列访问,+1提供了此功能!!你能推荐一些可以学习这种风格的书吗?@AdamDavies任何关于Scala的书都可以。您还可以仔细查看Scala Collections API提供的所有函数(,…),我喜欢这个答案和模式匹配的使用。我不确定我是否理解,但这是有趣的部分…干得好!非常感谢。
val groups = list.map(_.split(":")).groupBy(_(0)).mapValues(_.map(_(1)))
val males = groups("male")
val females = groups("female")
val map = list1.map(s => s.split(":") match {
case Array(sex, name) => (sex, name)
})
.groupBy { case (sex, name) => sex }
.mapValues(_.map{ case (sex, name) => name })
val male = map("male")
// List(Adam, Peter)
val female = map("female")
// List(Jane, Sue, Jo)