2016-11-05 3 views
5

Я новичок в Scala и проверял функцию карты на карте. Вот моя карта:Scala - map function - Только вернувшийся последний элемент карты

scala> val map1 = Map ("abc" -> 1, "efg" -> 2, "hij" -> 3) 
    map1: scala.collection.immutable.Map[String,Int] = 
      Map(abc -> 1, efg -> 2, hij -> 3) 

Вот функция карты и результат:

scala> val result1 = map1.map(kv => (kv._1.toUpperCase, kv._2)) 
    result1: scala.collection.immutable.Map[String,Int] = 
      Map(ABC -> 1, EFG -> 2, HIJ -> 3) 

Вот другая функция карты и результат:

scala> val result1 = map1.map(kv => (kv._1.length, kv._2)) 
    result1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 3) 

Первая карта функция возвращает все члены, как ожидалось, однако вторая функция карты возвращает только последний член Карты. Может кто-нибудь объяснить, почему это происходит?

Заранее благодарен!

ответ

8

В Scala у Map не может быть дубликатов ключей. Когда вы добавляете новую пару key -> value в Map, если этот ключ уже существует, вы перезаписываете предыдущее значение. Если вы создаете карты из функциональных операций над коллекциями, то вы получите в конечном итоге значение, соответствующее экземпляру последнего каждого уникального ключа. В примере, который вы написали, каждый строковый ключ исходной карты map1 имеет одинаковую длину, поэтому все ваши строковые ключи производят один и тот же целочисленный ключ 3 для result1. То, что происходит под капотом, чтобы вычислить result1 является:

  1. новой пустая карта создаются
  2. Вы карта "abc" -> 1 к 3 -> 3 и добавить его к карте. Результат теперь содержит 1 -> 3.
  3. Вы размещаете "efg" -> 2 по номеру 3 -> 2 и добавляйте его на карту. Поскольку ключ тот же, вы перезаписываете существующее значение для key = 3. Результат теперь содержит 2 -> 3.
  4. Вы размещаете "hij" -> 3 по номеру 3 -> 3 и добавляйте его на карту. Поскольку ключ тот же, вы перезаписываете существующее значение для key = 3. Результат теперь содержит 3 -> 3.
  5. Верните результат, который является Map(3 -> 3) `.

Примечание. Я сделал упрощенное предположение, что порядок элементов в итераторе карты совпадает с порядком, указанным в объявлении. Порядок определяется хэш-бином и, вероятно, не соответствует порядку добавления элементов, поэтому не строите ничего, что полагается на это предположение.

+0

Большое спасибо, Тим! – chandlerlx

 Смежные вопросы

  • Нет связанных вопросов^_^