Scala: использование HashMap со значением по умолчанию - PullRequest
31 голосов
/ 06 сентября 2010

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

var x = HashMap(1 -> "b", 2 -> "a", 3 -> "c")

println(x.getOrElse(4, "_")
println(x.getOrElse(5, "_"))
// And so on...
println(x.getOrElse(10, "_"))

Есть ли способ создать HashMap (или аналогичный класс), такой, чтобы попытка получить доступ к неопределенным ключам вернулазначение по умолчанию, установленное при создании HashMap?Я заметил, что HashMap.default просто выбрасывает исключение, но мне интересно, можно ли это изменить ...

Ответы [ 4 ]

70 голосов
/ 06 сентября 2011

Ух ты, я случайно посетил эту ветку ровно через год после того, как опубликовал свой последний ответ здесь. : -)

Scala 2.9.1. mutable.Map поставляется с withDefaultValue методом. REPL сессия:

scala> import collection.mutable
import collection.mutable

scala> mutable.Map[Int, String]().withDefaultValue("")
res18: scala.collection.mutable.Map[Int,String] = Map()

scala> res18(3)
res19: String = ""
35 голосов
/ 06 сентября 2010

Попробуйте:

import collection.mutable.HashMap
val x = new HashMap[Int,String]()  { override def default(key:Int) = "-" }
x += (1 -> "b", 2 -> "a", 3 -> "c")

Тогда:

scala> x(1)
res7: String = b

scala> x(2)
res8: String = a

scala> x(3)
res9: String = c

scala> x(4)
res10: String = -
1 голос
/ 06 сентября 2010
scala> val x = HashMap(1 -> "b", 2 -> "a", 3 -> "c").withDefaultValue("-")
x: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,b), (2,a), (3,c))

scala> x(3)
res0: java.lang.String = c

scala> x(5)
res1: java.lang.String = -

РЕДАКТИРОВАТЬ:

Для mutable.HashMap вы можете сделать следующее:

scala> import collection.mutable
import collection.mutable

scala> val x = new mutable.HashMap[Int, String] {
     |   override def apply(key: Int) = super.get(key) getOrElse "-"
     | }
x: scala.collection.mutable.HashMap[Int,String] = Map()

scala> x += (1 -> "a", 2 -> "b", 3 -> "c")
res9: x.type = Map((2,b), (1,a), (3,c))

scala> x(2)
res10: String = b

scala> x(4)
res11: String = -

Возможно, есть лучший способ сделать это.Подождите, пока другие ответят.

0 голосов
/ 06 сентября 2010

Я скорее Java-парень ... но если getOrElse не является окончательным, почему бы вам просто не расширить HasMap и предоставить что-то вроде этого:

override def getOrElse(k: Int, default: String) = {
  return super.getOrElse(k,"_")
}

Примечание: синтаксис, вероятно, облажался, но, надеюсь, вы поймете смысл

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