En Scala, llamar al groupBy()
en una colección devuelve un Map
donde los valores son colecciones, pero quiero un MultiMap
. ¿Cuál es la forma más fácil de hacer la conversión? ¿Puedo evitar crear un nuevo MultiMap
y copiar todo?¿Debo crear un nuevo objeto para mezclar en un rasgo de Scala?
Respuesta
Creo que la respuesta a "¿Tengo que crear un objeto nuevo para mezclar en un rasgo de Scala?" Es sí". Puede minimizar el dolor con envolviendo objetos y conversiones implícitas.
Para su problema específico, he podido coaccionar GroupBy (...) para devolver un mapa mutable a conjuntos mutables, lo que usted necesita para envolverlo con "MapProxy con MultiMap". Sin embargo, no es demasiado muchas líneas de código para implementar su propia versión de "GroupBy":
package blevins.example
object App extends Application {
implicit def multiMapable[B](c: Iterable[B]) = new {
def groupByMM[A](f: B => A) = {
import scala.collection.mutable._
val ret = new HashMap[A,Set[B]] with MultiMap[A,B]
for (e <- c) { ret.addBinding(f(e), e) }
ret
}
}
val c = List(1,2,3,4,5,6,7,8,9)
val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" }
mm.addBinding("alpha",12)
println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12))
}
Adición
Aquí está un ejemplo de envolver un mapa existente [String, Conjunto [Int]] en un MultiMap sin copiar los valores:
object App extends Application {
import scala.collection.mutable._
val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5))
val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] {
val self = seed
}
multiMap.addBinding("even", 8)
println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2))
}
Tenga en cuenta que esto no puede hacerse en el resultado de GroupBy (...) porque el mapa de semillas se requiere que b e mutable y groupBy (...) devuelve un mapa inmutable.
- 1. ¿Cómo mezclar un rasgo con una instancia?
- 2. ¿Por qué se crea una clase anónima al mezclar un rasgo?
- 3. rasgo Monad en Scala
- 4. ¿Por qué "clase de caso" no necesita "nuevo" para crear un nuevo objeto
- 5. Componer comportamiento rasgo en Scala en un Akka reciben método
- 6. Crear nuevo * paquete * en un complemento de compilación de Scala
- 7. Php: ¿Paréntesis al crear un objeto nuevo?
- 8. Rasgo, FunciónN o Rasgo-heredando-FunciónN en Scala?
- 9. ¿Cómo creo una instancia de un rasgo en un método genérico en scala?
- 10. ¿Cómo se define un rasgo de paquete * privado * en Scala?
- 11. Apache Commons NET: ¿Debo crear un nuevo objeto FTPClient en cada conexión o reutilizar uno?
- 12. ¿Qué significa instanciar un rasgo?
- 13. Crear un nuevo objeto de ubicación en javascript
- 14. ¿Es mejor crear un nuevo objeto y devolverlo o crear el nuevo objeto en la declaración de devolución?
- 15. ¿Por qué un rasgo de Scala puede extender una clase?
- 16. ¿Cómo consigo la clase en tiempo de ejecución de un tipo parametrizado en un rasgo Scala
- 17. Crear nuevo objeto de lista en Python
- 18. Crear referencia al nuevo objeto
- 19. ¿Qué es un rasgo sellado?
- 20. Llamar a un método en la superclase en un rasgo auto tipado en scala
- 21. Cómo crear un nuevo usuario en AWS
- 22. En C++, ¿por qué se necesita `nuevo` para crear dinámicamente un objeto en lugar de asignación?
- 23. ¿Cómo crear un nuevo entorno en Ruby on Rails?
- 24. Cómo crear un DSL interno en Scala?
- 25. Soporte de biblioteca para el rasgo NotNull de Scala
- 26. ¿Puedo anular un método de clase scala con un método de un rasgo?
- 27. ¿Debo hacer un objeto DateRange?
- 28. ¿Cómo crear un parche para un nuevo archivo?
- 29. ¿Debo compartir el contexto Entidad-Marco o crear un nuevo contexto para cada operación?
- 30. Extendiendo un rasgo y tipos
Llamar a groupBy() y una colección mutable devuelve un mutable.Map. –
¿Se puede demostrar un grupo al devolver un mapa mutable? Aparece un error de compilación como el que se muestra aquí (http://gist.github.com/245062). –
Supongo que devuelve un mapa inmutable de conjuntos mutables? De todos modos, no quiero un mapa, quiero un multimap. –