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.

Clojure: recorrer mapas de vectores y agregar elementos que se repiten

Espero que todos estén bien. Bueno, soy nuevo en la programación de Clojure y me gustaría un poco de ayuda. Tengo el siguiente vector de mapas:

(def curves [{:curve_buyer “curve1” :curve_seller “curve2” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curve3” :quantity 2 :value 4}
{:curve_buyer “curve3” :curve_seller “curve2” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curve3” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curve2” :quantity 4 :value 4}
{:curve_buyer “curve1” :curve_seller “curve3” :quantity 2 :value 4}])

Necesito hacer una verificación en ese vector, donde comprueba las claves (:curve_buyer y :curve_seller) que tienen el mismo valor. Si tienen el mismo valor, necesito agregar la cantidad y el valor, de lo contrario, devolver el mapa tal como está. Tomando el mapa anterior, tendría el siguiente resultado:

(def curves [{:curve_buyer “curve1” :curve_seller “curve2” :quantity 6 :value 7}
{:curve_buyer “curve2” :curve_seller “curve3” :quantity 2 :value 4}
{:curve_buyer “curve3” :curve_seller “curve2” :quantity 2 :value 3}
{:curve_buyer “curve1” :curve_seller “curva3” :quantity 4 :value 7}])

Necesito una función que haga esto. Cualquier forma utilizando las funciones de Clojure o una idea de una función que pueda resolver mi problema.

Gracias por su atención y estoy dispuesto a cualquier aclaración.

Tags:  

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puede usar la función group-by para agrupar el vector de mapas por los valores comunes de :curve_buyer y :curve_seller. Después de eso, itere a través de los grupos y fusiona los mapas que tienen los mismos valores para las claves :curve_buyer y :curve_seller, mientras suma los valores de las claves :quantity y :value. Aquí hay una función de ejemplo que hace esto:

    (defn merge-maps [maps]
      (let [groups (group-by #(hash-map (:curve_buyer %) (:curve_seller %)) maps)]
        (mapv #(reduce (fn [acc m] (merge-with + acc m)) %)
              (vals groups))))
    

    Así es cómo puedes usar esta función con tu vector de entrada:

    (def curves [{:curve_buyer "curve1" :curve_seller "curve2" :quantity 2 :value 3}
                 {:curve_buyer "curve1" :curve_seller "curve3" :quantity 2 :value 4}
                 {:curve_buyer "curve3" :curve_seller "curve2" :quantity 2 :value 3}
                 {:curve_buyer "curve1" :curve_seller "curve3" :quantity 2 :value 3}
                 {:curve_buyer "curve1" :curve_seller "curve2" :quantity 4 :value 4}
                 {:curve_buyer "curve1" :curve_seller "curve3" :quantity 2 :value 4}])
    
    (merge-maps curves)
    

    Esto producirá la siguiente salida:

    [{:curve_buyer "curve1", :curve_seller "curve3", :quantity 4, :value 7}
     {:curve_buyer "curve1", :curve_seller "curve2", :quantity 6, :value 7}
     {:curve_buyer "curve3", :curve_seller "curve2", :quantity 2, :value 3}]
    

    Esta es la salida esperada que fusiona los mapas con los mismos valores para :curve_buyer y :curve_seller, mientras suma los valores de :quantity y :value.

Comments are closed.