2014-12-11 15 views
5

La libreria Scala Collection ha mapValues e filterKeys. Il motivo per cui non ha mapKeys è probabile l'aspetto prestazionale (per quanto riguarda HashMap implementazione), come discusso qui per Haskell: Why there's not mapKeys in Data.Hashmap?Perché nessuna mapKey in Scala?

Tuttavia.

implicazioni sulle prestazioni a parte, mi trovo a dover mapKeys almeno tanto quanto mapValues, semplicemente per massaggiare i dati (vale a dire che sto utilizzando una mappa per l'astrazione dei dati, non per il suo prendere velocità).

Mi sbaglio e quale modello di dati utilizzeresti per questo? Le tuple?

+1

Se la mappatura delle chiavi produce una collisione, quale dei valori ci si aspetta di trovare nella nuova mappa? Il primo, l'ultimo o la raccolta di tutti i valori con la stessa chiave? –

+0

Buon punto. Nel mio caso non garantirei alcuna collisione, ma ciò dimostra quanto bisogna considerare nella progettazione delle librerie di raccolta. – akauppi

+0

@LeifWickland, lo stesso accade quando si esegue il mapping su un 'Set' in Scala: potrebbe ridursi. –

risposta

10

Non ne ho idea perché non è nella libreria standard, ma si può facilmente magnaccia la libreria con classe implicita

implicit class MapFunctions[A, B](val map: Map[A, B]) extends AnyVal { 
    def mapKeys[A1](f: A => A1): Map[A1, B] = map.map({ case (a, b) => (f(a), b) }) 
    } 

    val m = Map(1 -> "aaa", 2 -> "bbb") 

    println(m.mapKeys(_ + 1)) 
2

È possibile utilizzare scalaz:

import scalaz.Scalaz._ 

val m = Map(1 -> "aaa", 2 -> "bbb") 
m.mapKeys(_ + 1) 

In caso di collisioni Il risultato può essere più piccolo della mappa originale.

+0

Scalaz è come Boost per C++ e non lo tocco per le stesse ragioni. – akauppi

+0

Accetto. E penso che dovrebbe servire anche come un pool di idee per gli sviluppatori di scala compiler. Non ho idea del motivo per cui non li considerano. Questo metodo mapKeys è un chiaro esempio che ogni sviluppatore si aspetterebbe nella libreria di raccolta. – mirelon

+0

@akauppi cosa c'è che non va con Boost e Scalaz? –

Problemi correlati