列出案例 class scala
list with case class scala
我有以下问题我有以下列表作为输入
val input:List[Item]=List(FRDVE,12
SDED,13
prog-d,11
PROG-D,15
a-prog-d,17)
和
case class Item(Name:String,Number:Int)
目的是仅查找名称包含 prog-d 或 PROG-D 的第一行
所以对于这种情况,预期输出是:
val output="prog-d"
我写了下面的代码:
def getName(input:List[Item]):Option[String]={
val matchLine=input.filter(Name.contains("prog-d"))
matchLine match {
case head::tail => Some(matchLine.head.split(",")(0))
case isEmpty => None
}
}
所以这里我收到一条错误消息,指出该名称不存在,我不知道如何在包含中放入不同的可能性:这里基本上应该是:Name.contains("prog-d" ||"PROG-D")
有什么建议请
非常感谢
您可以使用 item.Name == "prog-d" || item.Name == "PROG-D"
或 item.Name.equalsIgnoreCase("prog-d")
scala> val input = List(Item("FRDVE",12), Item("SDED",13), Item("prog-d",11), Item("PROG-D",15), Item("a-prog-d",17))
input: List[Item] = List(Item(FRDVE,12), Item(SDED,13), Item(prog-d,11), Item(PROG-D,15), Item(a-prog-d,17))
scala> input.filter(item => item.Name.equalsIgnoreCase("prog-d")).map(_.Name)
res1: List[String] = List(prog-d, PROG-D)
如果您想要第一场比赛,请执行 headOption
并根据您想要的数据进行比赛。
scala> val output = input.filter(item => item.Name.equalsIgnoreCase("prog-d")).headOption
output: Option[Item] = Some(Item(prog-d,11))
scala> val outputName = input.filter(item => item.Name.equalsIgnoreCase("prog-d")).headOption.map(_.Name)
outputName: Option[String] = Some(prog-d)
注意: (.head
使用不安全,因为List().head
会在列表为空时爆炸)
scala> List.empty[Item].head
java.util.NoSuchElementException: head of empty list
at scala.collection.immutable.Nil$.head(List.scala:428)
at scala.collection.immutable.Nil$.head(List.scala:425)
... 28 elided
您可以使用 collectFirst
:
input.collectFirst { case Item(s, _) if s.equalsIgnoreCase("prog-d") => s }
这避免了 map
和 filter
,因此仅检查必要的最少条目。
完整代码:
case class Item(name: String, number: Int)
val input: List[Item] = List(
Item("FRDVE", 12),
Item("SDED", 13),
Item("prog-d", 11),
Item("PROG-D", 15),
Item("a-prog-d", 17),
)
val output = input.collectFirst {
case Item(s, _) if s.equalsIgnoreCase("prog-d") => s
}
println(output)
您还可以使用 find
,其中此函数 returns 匹配您的条件的第一个元素的选项(停止迭代剩余元素)。
case class Item(Name:String,Number:Int)
val input = List(Item("FRDVE",12), Item("SDED",13), Item("prog-d",11), Item("PROG-D",15), Item("a-prog-d",17))
input.find(_.Name.equalsIgnoreCase("prog-d")) match {
case Some(item) => item.Name
case None => "" //your default string
}
我有以下问题我有以下列表作为输入
val input:List[Item]=List(FRDVE,12
SDED,13
prog-d,11
PROG-D,15
a-prog-d,17)
和
case class Item(Name:String,Number:Int)
目的是仅查找名称包含 prog-d 或 PROG-D 的第一行
所以对于这种情况,预期输出是:
val output="prog-d"
我写了下面的代码:
def getName(input:List[Item]):Option[String]={
val matchLine=input.filter(Name.contains("prog-d"))
matchLine match {
case head::tail => Some(matchLine.head.split(",")(0))
case isEmpty => None
}
}
所以这里我收到一条错误消息,指出该名称不存在,我不知道如何在包含中放入不同的可能性:这里基本上应该是:Name.contains("prog-d" ||"PROG-D")
有什么建议请
非常感谢
您可以使用 item.Name == "prog-d" || item.Name == "PROG-D"
或 item.Name.equalsIgnoreCase("prog-d")
scala> val input = List(Item("FRDVE",12), Item("SDED",13), Item("prog-d",11), Item("PROG-D",15), Item("a-prog-d",17))
input: List[Item] = List(Item(FRDVE,12), Item(SDED,13), Item(prog-d,11), Item(PROG-D,15), Item(a-prog-d,17))
scala> input.filter(item => item.Name.equalsIgnoreCase("prog-d")).map(_.Name)
res1: List[String] = List(prog-d, PROG-D)
如果您想要第一场比赛,请执行 headOption
并根据您想要的数据进行比赛。
scala> val output = input.filter(item => item.Name.equalsIgnoreCase("prog-d")).headOption
output: Option[Item] = Some(Item(prog-d,11))
scala> val outputName = input.filter(item => item.Name.equalsIgnoreCase("prog-d")).headOption.map(_.Name)
outputName: Option[String] = Some(prog-d)
注意: (.head
使用不安全,因为List().head
会在列表为空时爆炸)
scala> List.empty[Item].head
java.util.NoSuchElementException: head of empty list
at scala.collection.immutable.Nil$.head(List.scala:428)
at scala.collection.immutable.Nil$.head(List.scala:425)
... 28 elided
您可以使用 collectFirst
:
input.collectFirst { case Item(s, _) if s.equalsIgnoreCase("prog-d") => s }
这避免了 map
和 filter
,因此仅检查必要的最少条目。
完整代码:
case class Item(name: String, number: Int)
val input: List[Item] = List(
Item("FRDVE", 12),
Item("SDED", 13),
Item("prog-d", 11),
Item("PROG-D", 15),
Item("a-prog-d", 17),
)
val output = input.collectFirst {
case Item(s, _) if s.equalsIgnoreCase("prog-d") => s
}
println(output)
您还可以使用 find
,其中此函数 returns 匹配您的条件的第一个元素的选项(停止迭代剩余元素)。
case class Item(Name:String,Number:Int)
val input = List(Item("FRDVE",12), Item("SDED",13), Item("prog-d",11), Item("PROG-D",15), Item("a-prog-d",17))
input.find(_.Name.equalsIgnoreCase("prog-d")) match {
case Some(item) => item.Name
case None => "" //your default string
}