Как создать неизменную Карту в Scala, используя складывания? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать неизменную карту хеша [String, (String, Int)], используя следующий код:

def genList(xx: String) = {
    Seq("one", "two", "three", "four")
}

val oriwords = Set("hello", "how", "are", "you")

val newMap = (Map[String, (String, Int)]() /: oriwords) (
    (cmap, currentWord) => {
        val xv = 2

        genList(currentWord).map(ps => {
            val src = cmap get ps

            if(src == None) {
                cmap + (ps -> ((currentWord, xv)))
            }
            else {
                if(src.get._2 < xv) {
                    cmap + (ps -> ((currentWord, xv)))
                }
                else cmap
            }

        })
    }
)

С этим кодом я получаю следующее исключение:

error: type mismatch;
 found   : Seq[scala.collection.immutable.Map[String,(String, Int)]]
 required: scala.collection.immutable.Map[String,(String, Int)]
               genList(currentWord).map(ps => {
                                       ^

Я знаю, что он возвращает list из Map[String, (String, Int)] в отличие от обновления для Map[String, (String, Int)] для операции сгиба.К сожалению, я получаю какие-либо указания, как это исправить.Я очень новичок в Scala.

Ожидаемый результат:

scala.collection.immutable.Map[String,(String, Int)] = Map(one -> (are,2), two -> (are,2), three -> (are,2), four -> (are,2))

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Аккумулятор, который возвращает foldLeft, имеет тип Seq[Map[String, (String, Int)]], когда он должен быть Map[String, (String, Int)]

Как упоминалось выше, причина в том, что вы звоните map на Seq, который возвращаетSeq.Вы можете решить эту проблему, используя foldLeft

  def genList(xx: String) = {
    Seq("one", "two", "three", "four")
  }

  val oriwords = Set("hello", "how", "are", "you")

  val newMap = (Map[String, (String, Int)]() /: oriwords) (
    (cmap, currentWord) => {
      val xv = 2

      genList(currentWord).foldLeft(cmap) {
        (acc, ps) => {
          val src = acc get ps

          if (src == None) {
            acc + (ps -> ((currentWord, xv)))
          }
          else {
            if (src.get._2 < xv) {
              acc + (ps -> ((currentWord, xv)))
            }
            else acc
          }

        }
      }
    }
  )

  println(newMap)

Map(one -> (hello,2), two -> (hello,2), three -> (hello,2), four -> (hello,2))

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

0 голосов
/ 19 ноября 2018

Использование сгиба:

def genList(xx: String) = {
    Seq("one", "two", "three", "four")
}

val oriwords = Set("hello", "how", "are", "you")

val newMap = (Map[String, (String, Int)]() /: oriwords) (
    (cmap, currentWord) => {
        val xv = 2

        genList(currentWord).map(ps => {
            val src = cmap get ps

            if(src == None) {
                cmap + (ps -> ((currentWord, xv)))
            }
            else {
                if(src.get._2 < xv) {
                    cmap + (ps -> ((currentWord, xv)))
                }
                else cmap
            }

        }).fold(Map[String, (String, Int)]())((a, b) => a ++ b)
    }
)
println(newMap) //Map(one -> (hello,2), two -> (hello,2), three -> (hello,2), four -> (hello,2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...