SOLUTION TO YOUR CODE
You have two failures, first of all, although it would be the right thing to do, you can not add this
to each recursion, because the method is executed by Sector
and you pass another one !!!! This will add the same to each round, ignoring the sector to process itself. So:
public ArrayList<Sector> obtenerTotalSubsectores(Sector sector, ArrayList<Sector> sectores) {
sectores.add(sector);
if (sector.getSectores() != null) {
for (Sector sector1 : sector.getSectores()) {
obtenerTotalSubsectores(sector1, sectores);
}
}
return sectores;
}
The second is that you send a ArrayList
of sectors full, which does not have much logic, you must create a new object to fill, modifying your main:
ArrayList<Sector> sectores = new ArrayList<Sector>();
s1.obtenerTotalSubsectores(s1, sectores);
System.out.println("TOTAL SECTORES EN EL " + s1.getNumero());
for (Sector s : sectores) {
System.out.println(s.toString());
}
sectores.clear();
s2.obtenerTotalSubsectores(s2, sectores);
System.out.println("\n\nTOTAL SECTORES EN EL " + s2.getNumero());
for (Sector s : sectores) {
System.out.println(s.toString());
}
We have this output (I have added a toString()
standard to check the outputs more easily)
TOTAL SECTORES EN EL 100
Sector [numero=100, denominacion=sales, tipo=sales, sectores=[Sector [numero=101, denominacion=minor sales, tipo=minor, sectores=[]], Sector [numero=102, denominacion=mayor sales, tipo=mayor, sectores=[Sector [numero=102, denominacion=lala sales, tipo=lalala, sectores=[]]]], Sector [numero=200, denominacion=Sistemas, tipo=sistemas, sectores=[Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]]]]]
Sector [numero=101, denominacion=minor sales, tipo=minor, sectores=[]]
Sector [numero=102, denominacion=mayor sales, tipo=mayor, sectores=[Sector [numero=102, denominacion=lala sales, tipo=lalala, sectores=[]]]]
Sector [numero=102, denominacion=lala sales, tipo=lalala, sectores=[]]
Sector [numero=200, denominacion=Sistemas, tipo=sistemas, sectores=[Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]]]
Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]
TOTAL SECTORES EN EL 200
Sector [numero=200, denominacion=Sistemas, tipo=sistemas, sectores=[Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]]]
Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]
CORRECT SOLUTION
Now, clarified that you are failing, I think you are not using the recursion correctly, I mean, since the method has the Sector
, you do not have to pass it to the method every time, since it will be executed within the same, you only need to pass the list to fill.
So as not to get involved, or to get involved, let's see the code:
public ArrayList<Sector> obtenerTotalSubsectores(ArrayList<Sector> sectores) {
sectores.add(this);
if (this.getSectores() != null) {
for (Sector sector1 : this.getSectores()) {
sector1.obtenerTotalSubsectores(sectores);
}
}
return sectores;
}
Now that you can add this
since the recursion is running correctly from the sector processed at that moment, downloading the method of an attribute and clarifying the code (although increasing the abstraction)
The same main modified would be like this:
ArrayList<Sector> sectores = new ArrayList<Sector>();
s1.obtenerTotalSubsectores(sectores);
System.out.println("TOTAL SECTORES EN EL " + s1.getNumero());
for (Sector s : sectores) {
System.out.println(s.toString());
}
sectores.clear();
s2.obtenerTotalSubsectores(sectores);
System.out.println("\n\nTOTAL SECTORES EN EL " + s2.getNumero());
for (Sector s : sectores) {
System.out.println(s.toString());
}
And it would give us the same result:
TOTAL SECTORES EN EL 100
Sector [numero=100, denominacion=sales, tipo=sales, sectores=[Sector [numero=101, denominacion=minor sales, tipo=minor, sectores=[]], Sector [numero=102, denominacion=mayor sales, tipo=mayor, sectores=[Sector [numero=102, denominacion=lala sales, tipo=lalala, sectores=[]]]], Sector [numero=200, denominacion=Sistemas, tipo=sistemas, sectores=[Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]]]]]
Sector [numero=101, denominacion=minor sales, tipo=minor, sectores=[]]
Sector [numero=102, denominacion=mayor sales, tipo=mayor, sectores=[Sector [numero=102, denominacion=lala sales, tipo=lalala, sectores=[]]]]
Sector [numero=102, denominacion=lala sales, tipo=lalala, sectores=[]]
Sector [numero=200, denominacion=Sistemas, tipo=sistemas, sectores=[Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]]]
Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]
TOTAL SECTORES EN EL 200
Sector [numero=200, denominacion=Sistemas, tipo=sistemas, sectores=[Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]]]
Sector [numero=201, denominacion=Soporte Técnico, tipo=soporte, sectores=[]]