Duda con Iterator en Java.

bloodhound

Buenas noches,

Estoy intentando hacer un programilla muy básico de como funciona el sistema de archivos NTFS.
La cosa es que estoy atascado en una función que borra todos los subdirectorios de una carpeta.

Mi idea es ir accediendo a ellos de uno en uno por recursividad. Es decir.

1.Tengo el objeto A.
-> Hay algo dentro?
---->Si. Llamada al objeto con la misma funcion.
---->No. Borrar y avanzar al siguiente objeto.
2.return;

La función en si es void. Y estoy usando un objeto llamado Carpeta, que usa un LinkedList<Carpeta> para guardar los hijos.

Agradecería cualquier tipo de ayuda.

EDIT @ 06/04/2011 15:00

SOLUCIÓN

/** Método que elimina de forma recursiva los subdirectorios de un sistema de carpetas y sus
*ficheros.
*
*	@return boolean
*	@author bloodhound
*
* **/
private boolean borrarRecursivo( Carpeta borrar ){		
	
	LinkedList<Carpeta> hijos = borrar.getHijos();
	LinkedList<Fichero> ficheros = borrar.getFichero();
		
	if( !hijos.isEmpty() ){
		
for( Carpeta carpeta : hijos ){
		
	if ( borrarRecursivo( carpeta ) ){
		
		System.out.println( "Borramos los hijos." );	
			
	} //if
		
} //for 

if( !ficheros.isEmpty() ){
	
	System.out.println("Borrar ficheros.");
	
}


	return true;
	
} //if

	
if( !ficheros.isEmpty() ){
		
	System.out.println("Borrar ficheros.");
		
}
	
return false;
	
} //borrarRecursivo

He usado un for-each como me han recomendado por arriba.

Como dice Nucklear en #10 era un return que no estaba en su sitio. Ahora esta función recorre bien todas las carpetas. Podéis usarla si alguna vez la necesitais.

Gracias a todos.

bloodhound

Up!

JuAn4k4
borrarListado(Iterator<Carpeta> iterator) {
 if (iterator.hasNext())  {
   borrarCarpeta(iterator.next());
   borrarListado(iterator);
 }
}


borrarJerarquia(List<Carpeta> carpetas) {
 borrarListado(carpetas.iterator());
}

Pero vamos que lo suyo seria hacer un foreach


borrarJerarquia(List<Carpeta> carpetas) {
  for (Carpeta carpeta : carpetas) {
   borrarCarpeta(carpeta);
 }
}
1 respuesta
B

#3 Hace tiempo que no programo en java asi que lo mismo estoy diciendo una parida pero.. no saltaría una excepción por modificar los datos mientras se itera?
Como yo lo haría sería de la primera forma usando el método iterator.delete que habría que implementarlo.

dagavi

No salta excepción pero si hay que tener cuidado.

Yo recorría un vector con for(E e: l) y borraba algún elemento durante el recorrido, pero me hacía alguna cosa rara (no lo recuerdo exactamente, hace mucho de esto).

Al final lo acabé implementando con

for (int i = 0; i < l.size(); ++i) {
    if (delete element)
        l.remove(i--);
}
JuAn4k4

Saltaria si borras el elemento de la colección, pero el está borrando carpetas fisicas y no lógicas ¿no?

Así puede poner un 'deshacer cambios' y volver a crear lo que borró.

10 días después
bloodhound

Voy a ver si me explico ahora mejor que en #1.

Tengo una clase llamada Carpeta que tiene:

  • LinkedList<Carpeta> hijos = new LinkedList<Carpeta>(); //Aqui van los hijos de la carpeta.
    LinkedList<Fichero> ficheros = new LinkedList<Fichero>(); //Aqui los ficheros que contiene.

Entonces llegamos a la conclusión de que las carpetas tienen una lista de ficheros, y también tienen dentro una lista de carpetas que a su vez contienen más carpetas. Llegados a este punto quiero realizar una función que se encargue de borrar todos los elementos que haya por debajo.

El algoritmo sería (más o menos):

Por cada carpeta, llama a la misma función.

Una vez que no haya más carpetas (en profundidad), borra el LinkedList de archivos.

Pasa a la siguiente carpeta y borra los archivos. Una vez no quede nada más dentro del directorio más que carpetas, borra la carpeta. Así hasta llegar al de origen.

Y pasándolo a código he llegado a algo como esto:

EDIT: Ya está arreglado el bucle, era return que estaba donde no debía. =) Solucion en #1

bloodhound

Halp gurús del java en MV!!!!

Lecherito

No tengas prisa, esto es un foro y no un chat en vivo, la gente entra cuando puede, y te contesta igual, cuando puede. ^^

Nucklear

La duda ya está solucionada por MP, ahora #1 que vuelva y ponga la solucion por si a alguien le interesa.

En la primera iteración, tras borrar los hijos llegaba al return true, lo que lo hacía salir de la función y cortar el flujo del programa.

1 respuesta

Usuarios habituales