Lista de un grupo de triples en mapa con par de claves

de hoja:

Tengo una lista de triples

List<Triple<String, String, String>> triplets; 

Quiero grupo en un mapa como éste

Map<Pair<String, String>, String> mapping;

Donde valueel mapa es el tercer elemento del triple. Y en el caso de la misma keyse debe anular el tercer valor restante.

Por ejemplo

def triples = [ {a, b, c} ; {a, d, e} ; {a, b, f } ]
// grouping
def map = [ {a,b} : c ; {a, d} : e ]

¿Cómo hacer que el uso Java 8y su groupingen corrientes?

Ravindra Ranwala:

Esto debería funcionar:

Map<Pair<String, String>, String> result = triplets.stream()
    .collect(
        Collectors.toMap(
            t -> new Pair(t.getOne(), t.getTwo()),
            Triple::getThree,
            (v1, v2) -> v2
        )
    );

Ejemplo de una clase par parcial:

public class Pair<T, U> {
    //...

    @Override
    public int hashCode() {
        return one.hashCode() + two.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Pair))
            return false;
        Pair p = (Pair) obj;
        return p.one.equals(one) && p.two.equals(two);
    }
}

La HashMapusos clase equalsmétodo para identificar objetos clave única. Así que primero tiene que anular equalsy hashcodemétodos para mostrar la igualdad lógica de los Pairobjetos de la Mapclase.

A continuación, volver a los arroyos y lambda. Para cada uso triplete Collectors.toMapcon el Pairobjeto como la clave y el otro valor restante de la Tripletcomo el valor. A continuación, proporcionan una mergeFunctionpara manejar conflictos de clave. En su caso, usted necesita para mantener el valor anterior, pero liberada nuevo valor. Eso es todo lo que necesita hacer.

Actualizar

He actualizado la función de combinación de acuerdo con los comentarios a continuación.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=224683&siteId=1
Recomendado
Clasificación