我有一个名字列表和给定的字符范围A..F我试过这个:
val r = x.filter(_.name.startsWith('A' to 'F'))
但它不起作用,有什么建议吗?
如果第一个字符测试始终是一个范围,而不是离散字符的集合,则可以筛选 ASCII 值。
val r = x.filter(y => y.name.head >= 'A' && y.name.head <= 'F')
"存在列表 1 中的名称,因此存在列表 2 中的字母,因此名称的头部是字母":
list1.exists(name => list2.exists(letter => name.headOption == Some(letter)))
例子:
scala> List("Alice", "Bob").exists(name => ('A' to 'F').exists(letter => name.headOption == Some(letter)))
res1: Boolean = true
scala> List("Alice", "Bob").exists(name => ('X' to 'Z').exists(letter => name.headOption == Some(letter)))
res2: Boolean = false
您可以使用listOfExpectedChars.contains(firstLetter)
.
scala> val names = Seq("Architects", "Metallica", "Pink floyd", "Foo Fighters")
names: Seq[String] = List(Architects, Metallica, Pink floyd, Foo Fighters)
scala> names.filter(name => ('A' to 'F').contains(name(0)))
res1: Seq[String] = List(Architects, Foo Fighters)
name(0)
相当于name.head
。
scala> names.filter(name => ('A' to 'F').contains(name.head))
res2: Seq[String] = List(Architects, Foo Fighters)
请注意,.head
空数组错误java.util.NoSuchElementException
.所以更安全的方法是使用.headOption
scala> val names = Seq("Architects", "Metallica", "Pink floyd", "Foo Fighters", "")
names: Seq[String] = List(Architects, Metallica, Pink floyd, Foo Fighters, "")
scala> names.filter(name => ('A' to 'F').map(Option(_)).contains(name.headOption))
res3: Seq[String] = List(Architects, Foo Fighters)