List 从字符串拆分中获取唯一的字符串

List 从字符串拆分中获取唯一的字符串,list,scala,List,Scala,我想从输入中获取一个列表[String]。请帮我找到一个优雅的方式 期望输出: emp1,emp2 我的代码: val ls = List("emp1.id1", "emp2.id2","emp2.id3","emp1.id4") def myMethod(ls: List[String]): Unit = { ls.foreach(i => print(i.split('.').head)) } (

我想从输入中获取一个
列表[String]
。请帮我找到一个优雅的方式

期望输出:

emp1,emp2
我的代码:

val ls = List("emp1.id1", "emp2.id2","emp2.id3","emp1.id4")

def myMethod(ls: List[String]): Unit = {
  ls.foreach(i => print(i.split('.').head))
}

(myMethod(ls)). //set operation to make it unique ??

如果您关心验证,可以考虑使用正则表达式:

val ls = List("emp1.id1", "emp2.id2","emp2.id3","emp1.id4","boom")
  
  def myMethod(ls: List[String]) = {
    val empIdRegex = "([\\w]+)\\.([\\w]+)".r
    val employees = ls collect { case empIdRegex(emp, _) => emp }
    employees.distinct
  }

println(myMethod(ls))
产出:

List(emp1, emp2)

自Scala 2.13以来,您可以使用
List.unfold
执行以下操作:

List.unfold(ls) {
  case Nil =>
    None
  case x :: xs =>
    Some(x.takeWhile(_ != '.'), xs)
}.distinct
请不要使用不同的值,因此可以使用
Set.unfold

Set.unfold(ls) {
  case Nil =>
    None
  case x :: xs =>
    Some(x.takeWhile(_ != '.'), xs)
}

代码在运行。

这也适用。你看到的(split和head与takeWhile)ls.map(u.split('.').head)有什么不同或问题吗?我认为它更能表达逻辑,并且在碰到“.”时就会停止,而不是检查整个字符串。你在这里使用unique是什么意思?请详细说明你想要实现什么?谢谢。这也很棒,太好了。非常感谢你,兹维。
Set.unfold(ls) {
  case Nil =>
    None
  case x :: xs =>
    Some(x.takeWhile(_ != '.'), xs)
}