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 puedo aplanar una lista de objetos en listas anidadas?

Estoy trabajando con drools en una regla y tengo un hecho principal que se ve así:

  • Mainfact
    • ListOfTopObjects
    • TopObject
      • ListOfSecondLevelObjects
      • SecondLevelObjectA
      • SecondLevelObjectB
    • TopObject
      • ListOfSecondLevelObjects
      • SecondLevelObjectC

Lo que quiero es una lista que se vea así: [SecondLevelObjectA, SecondLevelObjectB, SecondLevelObjectC].

Intenté sin éxito el siguiente código:

$TopObjects: List()
    from collect( TopObject() from $MainFact.ListOfTopObjects)

$SecondLevelObjects: List()
    from accumulate( TopObject($x: ListOfSecondLevelObjects) from $TopObjects;
      collectList( $x ))

Pero esto solo produce una lista que se ve así:
[[SecondLevelObjectA, SecondLevelObjectB], [SecondLevelObjectC]].

¿Existe alguna forma de producir una lista plana o de aplanar la lista producida en el último paso?

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de aplanar la lista y obtener la salida deseada. Puedes usar la función flatten en drools para aplanar la lista anidada de SecondLevelObjects. El código modificado se vería así:

    $TopObjects: List()
        from collect( TopObject() from $MainFact.ListOfTopObjects)
    
    $SecondLevelObjects: List()
        from accumulate( TopObject($x: ListOfSecondLevelObjects) from $TopObjects;
          collectList( $x ))
    
    $FlattenedList: List() from accumulate( $list: $SecondLevelObjects; 
        init( List<object> result = new ArrayList<object>(); ),
        action( result.addAll($list); ),
        reverse( result ),
        result )
    
    

    En este código modificado, se utiliza accumulate para recopilar todos los SecondLevelObjects de ListOfSecondLevelObjects en la lista $SecondLevelObjects. Después de eso, se utiliza la función flatten para transformar las listas anidadas en una lista plana. Por último, se crea $FlattenedList utilizando la función accumulate. La lista $SecondLevelObjects se proporciona como entrada a la función, la cual se aplana y se almacena en $FlattenedList. Esta lista contendría todos los SecondLevelObjects sin ninguna lista anidada.

    ¡Espero que esto te ayude!

Comments are closed.