список с делом класса Scala - PullRequest
0 голосов
/ 08 июня 2018

У меня есть следующая проблема. У меня есть следующий список ввода

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") Любые рекомендации, пожалуйста Большое спасибо

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы можете использовать 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)
0 голосов
/ 09 июня 2018

Вы также можете использовать find, где эта функция возвращает опцию первых элементов, в зависимости от того, что соответствует вашему условию (прекращение итерации по оставшимся элементам).

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
    }
0 голосов
/ 08 июня 2018

вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...