Как правильно использовать Scala Hashmaps и Tuples вместе? - PullRequest
1 голос
/ 13 августа 2011

Мой код выглядит следующим образом

import scala.collection.mutable.HashMap
type CrossingInterval = (Date, Date)
val crossingMap = new HashMap[String, CrossingInterval]
val crossingData: String = ...

Во-первых, почему компилируется следующая строка?

val time = crossingMap.getOrElse(crossingData, -1)

Я бы подумал, что -1 было бы недопустимым значением

Во-вторых, как мне выполнить базовую проверку, такую ​​как следующее

if (value exists in map) {
}
else {
}

В Java я бы просто проверил на нулевые значения.Я не уверен в правильном способе сделать это в Scala

1 Ответ

5 голосов
/ 13 августа 2011

Ввод кода в интерпретаторе показывает, почему первый оператор компилируется:

type Date = String
scala> val time = crossingMap.getOrElse(crossingData, -1)
time: Any = -1

Обычно getOrElse для Map[A, B] (здесь B = CrossingDate) принимает параметр любого типа B1 >: B: это означает, что B1 должен быть супертипом B. Здесь B1 = Any, и -1, конечно, является допустимым значением типа Any. В этом случае вы действительно хотите иметь объявление типа для time.

Чтобы проверить, принадлежит ли ключ к карте, просто вызовите метод содержимого. Ниже приведен пример - поскольку Date не был доступен, я просто определил его как псевдоним String.

scala> crossingMap.contains(crossingData)
res13: Boolean = false
scala> crossingMap += "" -> ("", "")
res14: crossingMap.type = Map("" -> ("",""))
//Now "" is a map of the key
scala> crossingMap.contains("")
res15: Boolean = true

Если вы хотите проверить, является ли значение частью карты, проще всего написать этот код:

crossingMap.values.toSet.contains("")

Однако это создает Set, содержащий все значения. РЕДАКТИРОВАТЬ: Вы можете найти лучшее решение для этой подзадачи в комментарии Киптон Баррос.

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