Scala Map с опцией / некоторые дает ошибку совпадения - PullRequest
0 голосов
/ 07 июня 2018

Следующий код выдает ошибку времени выполнения, как показано ниже.Может быть причина, почему следующая ошибка.Пожалуйста, объясните.

Исключение в потоке "main" scala.MatchError: Some (Some (List (17))) (класса scala.Some) в com.discrete.CountingSupp $. $ Anonfun $tuplesWithRestrictions1 $ 1 (CountingSupp.scala: 43)

def tuplesWithRestrictions1(): (Int, Map[Int, Option[List[Int]]]) = {
    val df = new DecimalFormat("#")
    df.setMaximumFractionDigits(0)
    val result = ((0 until 1000) foldLeft[(Int, Map[Int, Option[List[Int]]])] ((0, Map.empty[Int, Option[List[Int]]]))) {
      (r: (Int, Map[Int, Option[List[Int]]]), x: Int) => {
        val str = df.format(x).toCharArray
        if (str.contains('7')) {
          import scala.math._
          val v = floor(log10(x)) - 1
          val v1 = (pow(10, v)).toInt
          val m: Map[Int, Option[List[Int]]] = (r._2).get(v1) match {
            case None => r._2 + (v1 -> Some(List(x)))
            case Some(xs: List[Int]) => r._2 updated(x, Some(x::xs))
          }
          val f = (r._1 + 1, m)
          f
        } else r
      }
    }
    result
  }

Ответы [ 2 ]

0 голосов
/ 08 июня 2018
def tuplesWithRestrictions1(): (Int, Map[Int, List[Int]]) = {
    val df = new DecimalFormat("#")
    df.setMaximumFractionDigits(0)
    val result = ((0 until 1000) foldLeft[(Int, Map[Int, List[Int]])] ((0, Map.empty[Int, List[Int]]))) {
      (r: (Int, Map[Int, List[Int]]), x: Int) => {
        val str = df.format(x).toCharArray
        if (str.contains('7')) {
          import scala.math._
          val v = floor(log10(x))
          val v1 = (pow(10, v)).toInt
          val m: Map[Int, List[Int]] = (r._2).get(v1) match {
            case Some(xs: List[Int]) => r._2 updated(v1, x :: xs)
            case None => r._2 + (v1 -> List(x))
          }
          val f = (r._1 + 1, m)
          f
        } else r
      }
    }
    result
  }
0 голосов
/ 07 июня 2018

Тип возврата .get на карте:

get(k: K): Option[V]

Scala doc

  /** Optionally returns the value associated with a key.
   *
   *  @param  key    the key value
   *  @return an option value containing the value associated with `key` in this map,
   *          or `None` if none exists.
   */
  def get(key: K): Option[V]

Теперь

r._2.get(v1) возвращает параметр значения.Таким образом, окончательный тип возвращаемого значения будет Option[Option[List[Int]]].

Вы пытаетесь сопоставить шаблон для Option[T], но реальным типом значения является Option[Option[Int]], который не фиксируется в совпадении.

  1. Используйте r._2(v1) для извлечения значения и сопоставления.Выдает исключение, когда v1 не найден на карте.

  2. Соответствие внутри map, обеспечивающее значение по умолчанию.

    r._2.get(k1).map {
      case None => r._2 + (v1 -> Some(List(x)))
      case Some(value) => r._2 updated(x, Some(x::xs))
    }.getOrElse(defaultValue)
    
...