2013-07-28 18 views
11

İlk önce, sorun sorgusu için özür dileriz. Ben Sabırsız' dini için `Scala okuma ve tüm egzersiz soruları çözmeye çalıştığı (ve bazı minimal bir araştırma yapıyor)`map` işlevini kullanma Map in Scala

Arkaplan am: egzersiz soru şöyle - Kurulum bir dizi fiyatlarının bir harita Sevdiğin gizemler. Daha sonra aynı anahtarlar ve fiyatları% 10 indirim ile ikinci bir harita oluşturun.

Maalesef bu noktada, scaladoc çoğu parçaları hala bana şifreli ama ben Map haritası işlevi bir işlevi alır ve bir işlev (sanırım?) Uygulandıktan sonra başka bir harita döndürür anlıyoruz - def map[B](f: (A) ⇒ B): HashMap[B]. Ben googling çalıştı ama map function for Map in scala

:-) Benim Soru pek faydalı sonuçlar alamadım: benim 3. varyasyon teşebbüs gibi, herhangi bir anlam ifade bu amaçla map işlevini kullanarak mı ya da varyasyon 2 ile sopa hangi aslında benim problemimi çözüyor.

Kodu: Bu durumda

val gizmos:Map[String,Double]=Map("Samsung Galaxy S4 Zoom"-> 1000, "Mac Pro"-> 6000.10, "Google Glass"->2000) 

//1. Normal for/yield 
val discountedGizmos=(for ((k,v)<-gizmos) yield (k, v*0.9)) //Works fine 

//2. Variation using mapValues 
val discGizmos1=gizmos.mapValues(_*0.9) //Works fine 

//3. Variation using only map function 
val discGizmos2=gizmos.map((_,v) =>v*0.9) //ERROR : Wrong number of parameters: expected 1 

cevap

15

, mapValues ​​daha uygun bir yöntem kullanmak gibi görünüyor. Tuşların bilgisini gerektiren bir dönüşüm gerçekleştirmeniz gerektiğinde harita yöntemini kullanırsınız (örneğin, bir ürün referansını bir ürün adına dönüştürerek).

Bu, harita yönteminin, harekete geçmeniz için hem anahtarlara hem de değerlere erişim sağladığından daha geneldir ve değerleri dönüştürüp anahtarları el değmeden geçirerek mapValues ​​yöntemini taklit edebilirsiniz - ve Yukarıdaki kodunuzda yanlış gittiğiniz yer burasıdır. Doğru haritası yöntemi kullanmak için, sadece bir anahtar değil, İşlevinizden bir (anahtar, değer) çifti üreten edilmelidir:

val discGizmos2=gizmos.map{ case (k,v) => (k,v*0.9) } // pass the key through unchanged 
+0

Vay. Bu mükemmel bir anlam ifade ediyor. Açıklamak için zaman ayırdığınız için çok teşekkürler. –

+1

'mapValues', mevcut harita üzerinde bir görünüm oluştururken, 'map', yepyeni bir harita oluşturduğuna dikkat çekiyor. – Daenyth

4

demek de olabilir:

val discGizmos2 = gizmos.map(kv => (kv._1, kv._2*0.9)) 
+0

Güzel. Scala'nın aynı şeyi birden çok şekilde yapmanıza izin vermesini seviyorum. Teşekkürler !! –

+0

bu bir tuple kullanarak eşdeğerdir .. yani kv sadece bir tupledır. – piyushGoyal