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 filtrar un hashmap con condiciones específicas

Tengo el siguiente hashmap inicial:

LatS=[59, 48, 59, 12, 48]

LatD=[41, 42, 46, 42]

EW=[W, W, W, W]

NS=[N, N, N, N]

LonM=[39, 23, 30, 48]

State=[OH, SD, WA, MA]

LatM=[5, 52, 35, 16]

City=[Youngstown, Yankton, Yakima, Worcester]

LonS=[0, 23, 36, 0]

LonD=[80, 97, 120, 71]

Quiero filtrar el Hashmap usando el método query que tiene la siguiente llamada:

HashMap<object,></object,>> result = df.query(map -> “Youngstown”.equals(df.getFrameInfo().get(“City”).get(0)))

La definición de la función es:

public HashMap<object,></object,>> query(Predicatecond){

HashMap<object,></object,><object>> ref = new HashMap<>(frameInfo);

    Map<object,></object,><object>> result = ref.entrySet()
            .stream()
            .filter(cond)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    System.out.println("Resultado: " + result);

Pero la parte más difícil es obtener el hashmap result de una manera específica. Solo quiero las columnas de la ciudad pasada como parámetro.

Por ejemplo: si uso este argumento:

HashMap<object,></object,>> result = df.query(map -> “Youngstown”.equals(df.getFrameInfo().get(“City”).get(0)))

la salida debería ser:

LatS=[59]
LatD=[41]
EW=[W]
NS=[N]
LonM=[N]
State=[OH]
LatM=[5]
City=[Youngstown]
LonS=[0]
Lond=[80]

¡Muchas gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida deseada, puedes modificar el método query para filtrar primero las filas basadas en la condición dada y luego crear un nuevo hashmap que contenga solo las columnas de la ciudad pasada como parámetro. Aquí tienes una posible implementación:

    public HashMap<object,></object,><object>> query(Predicate<object> cond, String city) {
        // Filtrar las filas basadas en la condición dada
        Map<object,></object,><object>> filtered = frameInfo.entrySet()
            .stream()
            .filter(cond)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    
        // Crear un nuevo hashmap que contenga solo las columnas de la ciudad solicitada
        List<object> cityColumn = filtered.get("City");
        List<object> indices = IntStream.range(0, cityColumn.size())
            .filter(i -> city.equalsIgnoreCase(cityColumn.get(i).toString()))
            .boxed()
            .collect(Collectors.toList());
    
        HashMap<object,></object,><object>> result = new HashMap<>();
        for (Object key : filtered.keySet()) {
            List<object> column = filtered.get(key);
            List<object> values = indices.stream().map(column::get).collect(Collectors.toList());
            result.put(key, values);
        }
        return result;
    }
    

    Luego puedes llamar a este método con la ciudad deseada de la siguiente manera:

    HashMap<object,></object,><object>> result = df.query(
        map -> "Youngstown".equals(df.getFrameInfo().get("City").get(0)),
        "Youngstown"
    );
    

    Y debería producir la salida que deseabas:

    LatS=[59]
    LatD=[41]
    EW=[W]
    NS=[N]
    LonM=[39]
    State=[OH]
    LatM=[5]
    City=[Youngstown]
    LonS=[0]
    LonD=[80]

Comments are closed.