Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将列表划分为两个以上的分区_Scala_Scala Collections - Fatal编程技术网

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)