scala - сопоставление по типу строки и получение его частоты - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть приведенные ниже сведения о типе данных из схемы таблицы улья, и мне нужно получить его частоту

val a = List("decimal(10,2)","string","string","decimal(6,0)",
              "timestamp","decimal(8)", "timestamp" )

val freq = a.map{
  x => x match {
    case  x.contains("decimal") => "decimal" // getting error here
    case "string" => "string"
    case "timestamp" => "date"
  }
}.groupBy(identity).mapValues(_.length)

println(freq)

Я получаю сообщение об ошибке, не могу разрешить символ ... что не так с кодом?.

Мне нужен вывод как

Map(date -> 2, decimal -> 3, string -> 2)

Если есть лучшие способы получить вышеуказанный вывод, то это тоже приветствуется

Ответы [ 2 ]

4 голосов
/ 24 апреля 2019

Вы также можете fold сверх List.

val freq = a.foldLeft(Map[String,Int]().withDefaultValue(0)){
  case (m,s) if s.startsWith("decimal") => m + ("decimal" -> (m("decimal")+1))
  case (m,"timestamp") => m + ("date" -> (m("date")+1))
  case (m,str)         => m + (str    -> (m(str)+1))
}
4 голосов
/ 24 апреля 2019

Вы можете использовать охрану в первом матче, чтобы достичь того, что вы пытаетесь сделать.

val freq = a.map{
  x => x match {
    case  x if  x.contains("decimal") => "decimal" // getting error here
    case "string" => "string"
    case "timestamp" => "date"
  }
}.groupBy(identity).mapValues(_.length)
...