2016-11-05 59 views
5

Jestem nowy w Scali i wypróbowuję funkcję mapy na mapie. Oto moja mapaScala - funkcja mapy - Tylko zwrócony ostatni element mapy

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

Oto funkcja map i wynik:

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) 

Oto kolejna funkcja map i wynik:

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

Pierwsza mapa funkcyjne powroty wszyscy członkowie zgodnie z oczekiwaniami, jednak druga funkcja mapy zwraca tylko ostatniego członka mapy. Czy ktoś może wyjaśnić, dlaczego tak się dzieje?

Z góry dziękuję!

Odpowiedz

8

W Scali, Map nie może mieć duplikatów kluczy. Po dodaniu nowej pary key -> value do Map, jeśli klucz już istnieje, nadpisujesz poprzednią wartość. Jeśli tworzysz mapy z operacji funkcjonalnych w kolekcjach, otrzymasz wartość odpowiadającą instancji ostatniej instancji każdego unikalnego klucza. W przykładzie, który napisałeś, każdy klucz ciągów oryginalnej mapy map1 ma tę samą długość, a więc wszystkie twoje klucze tekstowe dają ten sam klucz liczby całkowitej 3 dla result1. Co dzieje się pod maską obliczyć result1 jest:

  1. nowa, pusta mapa jest tworzona
  2. mapować "abc" -> 1 do 3 -> 3 i dodać go do mapy. Wynik zawiera teraz 1 -> 3.
  3. Mapujesz "efg" -> 2 na 3 -> 2 i dodajesz go do mapy. Ponieważ klucz jest taki sam, zastępujesz istniejącą wartość dla key = 3. Wynik zawiera teraz 2 -> 3.
  4. Mapujesz "hij" -> 3 na 3 -> 3 i dodajesz go do mapy. Ponieważ klucz jest taki sam, zastępujesz istniejącą wartość dla key = 3. Wynik zawiera teraz 3 -> 3.
  5. Zwróć wynik, który jest Map(3 -> 3) `.

Uwaga: Założyłem założenie upraszczające, że kolejność elementów w iteratorze mapy jest taka sama jak kolejność, którą napisałeś w deklaracji. Kolejność jest określona przez hash bin i prawdopodobnie nie będzie zgodna z kolejnością dodanych elementów, więc nie buduj niczego, co opiera się na tym założeniu.

+0

Wielkie dzięki, Tim! – chandlerlx