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.

Traverse a través de objetos vinculados.

Tengo este objeto, en el que cada Regla almacena una lista de Reglas:

public class Rule {

private String name;
private String condition;
private List<String> result;
private List<Rule> rules;
private Map<String, List<String>> aliases = Maps.newHashMap();
private boolean last = false;

}

¿Cuál es la manera más inteligente y eficiente para recorrer todos los objetos vinculados, e insertar todos los campos “results” en una lista, independientemente del objeto al que pertenezcan? Eventualmente, me gustaría tener una lista:

List<String> resultados que contenga todos los resultados de todos los objetos.

He estado intentando durante horas y apreciaría su ayuda. Obtener una lista de todos los objetos en sí mismos también me ayudará, como aplanar el árbol.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La manera más inteligente y eficiente de recorrer todos los objetos vinculados e insertar todos los campos “results” en una lista sería utilizar una función recursiva para iterar a través de cada objeto Rule y sus reglas anidadas. Aquí hay un ejemplo de cómo se puede hacer esto:

    public static List<string> getAllResults(List<regla> rules) {
        List<string> results = new ArrayList<>();
        for (Regla rule : rules) {
            results.addAll(rule.getResult());
            if (!rule.getRules().isEmpty()) {
                results.addAll(getAllResults(rule.getRules()));
            }
        }
        return results;
    }
    

    Esta función toma una lista de objetos Regla y de forma recursiva pasa por cada objeto Regla y sus reglas anidadas para recuperar todos los campos “results” y agregarlos a una lista.

    Si también quiere aplanar el árbol y obtener una lista de todos los objetos en sí mismos, puede modificar la función para que devuelva una lista de todos los objetos Rule:

    public static List<regla> flatten(List<regla> rules) {
        List<regla> aplanado = new ArrayList<>();
        for (Regla rule : rules) {
            aplanado.add(rule);
            if (!rule.getRules().isEmpty()) {
                aplanado.addAll(flatten(rule.getRules()));
            }
        }
        return aplanado;
    }
    

    Esta función también toma una lista de objetos Regla y de forma recursiva pasa por cada objeto Regla y sus reglas anidadas para recuperar todos los objetos Regla y agregarlos a una lista.

Comments are closed.