Scala создать строку из итерации по карте - PullRequest
9 голосов
/ 13 мая 2011

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

вместо этого

val myMap = Map("1" -> "2", "3"->"4") 
var s = ""
myMap foreach s += ...

Я бы предпочел, чтобы это было

var s = myMap something ...

Ответы [ 5 ]

18 голосов
/ 13 мая 2011

Я бы просто map и mkString.Например:

val s = (
    Map("1" -> "2", "3"->"4") 
    map { case (key, value) => "Key: %s\nValue: %s" format (key, value) } 
    mkString ("", "\n", "\n")
)
13 голосов
/ 13 мая 2011

Что касается ответа Даниэля, но с парой оптимизаций и моими собственными предпочтениями форматирования:

val myMap = Map("1" -> "2", "3"->"4")
val s = myMap.view map {
  case (key, value) => "Key: " + key + "\nValue: " + value
} mkString ("", "\n", "\n")

Оптимизации:

  1. Сначала создав view изкарта, я избегаю создания промежуточной коллекции
  2. При профилировании прямая конкатенация строк выполняется быстрее, чем String.format
7 голосов
/ 13 мая 2011

Вы можете сделать это со складкой:

scala> myMap.foldLeft("") { (s: String, pair: (String, String)) =>
     |   s + pair._1 + pair._2
     | }
res0: java.lang.String = 1234
2 голосов
/ 13 мая 2011

Это также хорошо работает, если вы не беспокоитесь о своем собственном форматировании:

scala> Map("1" -> "2", "3"->"4").mkString(", ")
res6: String = 1 -> 2, 3 -> 4
2 голосов
/ 13 мая 2011

Я довольно новичок в Scala, но вы можете попробовать reduceLeft.Он накапливает частичное значение (строка, соединяемая с каждым элементом).Например, если вы хотите, чтобы ключи (или значения) были объединены в строку, просто выполните:

val s = myMap.keys.reduceLeft( (e, s) =>  e + s)

Это приведет к "13"

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