es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo actualizar el valor de una clave en un árbol de mapas inmutable en Scala

Estoy utilizando Scala 2.11 y estoy tratando de actualizar el valor de una clave en el tree map. Intenté usar el método updated:

private val xyz = List(0, 100000, 500000, 1000000)
private val abc = List (0, 5, 25, 50)
private var a = TreeMap.empty[Int, TreeMap[Int, Int]] ++ xyz.map { 
        aa => aa -> (TreeMap.empty[Int, Int] ++ abc.map(bb => bb -> 0))
    }
a(xyz(0)).foreach { 
        case (key, value) =>
            if (key < 50) {
                a(xyz(0)) = a(xyz(0)).updated(key, 5)
            }
    }

Y obtuve el siguiente error:

value update is not a member of scala.collection.immutable.TreeMap[Int,scala.collection.immutable.TreeMap[Int,Int]]

¿Es posible actualizarlo? ¿O alguien podría ayudarme a replicar la lógica usando un Java TreeMap ya que también me permitirá usar las funciones floorEntry y ceilingEntry? Intenté convertirlo a un Java TreeMap y generó un mapa regular, no un tree map:

private var a = TreeMap.empty[Int, TreeMap[Int, Int]] ++ xyz.map { 
    aa => aa -> (TreeMap.empty[Int, Int] ++ abc.map(bb => bb -> 0)).asJava
}
private var b = a.asJava
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que TreeMap es inmutable y no tiene un método updated. Esto significa que no puedes actualizar un valor directamente en un TreeMap. En su lugar, necesitas crear un nuevo TreeMap con el valor actualizado y reemplazar el antiguo. Aquí tienes cómo puedes modificar tu código para actualizar el valor de una clave en el TreeMap:

    private val xyz = List(0, 100000, 500000, 1000000)
    private val abc = List(0, 5, 25, 50)
    private var a = TreeMap.empty[Int, TreeMap[Int, Int]] ++ xyz.map {
      aa => aa -> (TreeMap.empty[Int, Int] ++ abc.map(bb => bb -> 0))
    }
    
    a = a.updated(xyz(0), a(xyz(0)).updated(25, 5))
    

    Este código crea un nuevo TreeMap con el valor actualizado 5 en la clave 25 en el TreeMap en la clave 0 en a.

    Para replicar la lógica utilizando un TreeMap de Java, esto es lo que puedes hacer:

    private TreeMap<integer,></integer,><integer, integer="">> a = new TreeMap<>();
    private TreeMap<integer, integer=""> innerMap;
    
    for (int i = 0; i < 4; i++) {
        innerMap = new TreeMap<>();
        for (int j = 0; j < 4; j++) {
            innerMap.put(abc.get(j), 0);
        }
        a.put(xyz.get(i), innerMap);
    }
    
    a.get(xyz.get(0)).forEach((key, value) -> {
        if (key < 50) {
            a.get(xyz.get(0)).put(key, 5);
        }
    });
    
    TreeMap.Entry<integer,></integer,><integer, integer="">> floorEntry = a.floorEntry(500000);
    TreeMap.Entry<integer,></integer,><integer, integer="">> ceilingEntry = a.ceilingEntry(500000);
    

    Este código crea un TreeMap de Java y lo llena con los mismos datos que en la versión Scala. Luego, actualiza el valor de una clave de la misma manera que antes. Finalmente, demuestra cómo usar las funciones floorEntry y ceilingEntry en un TreeMap de Java.</integer,></integer,></integer,></integer,>

Comments are closed.