Aprende a utilizar la recursividad programando el comando tree


Para entender la recursividad primero hay que entender la recursividad 😂, pero ¿qué es ?, la recursividad es la posibilidad de que una función o método se llame a si mismo para ejecutar cierta lógica mientras se cumpla con una condición especificada.

Ejemplo práctico

Para entender como funciona crearemos un programa que haga lo mismo que el comando tree de linux, este comando lista todos los archivos y directorios que tenemos en el sistema operativo.

Entendiendo el problema

Una vez que entendemos lo que hace el comando tree debemos entender porque la única forma de programarlo es haciendo uso de la recursividad, imaginemos que contamos con la siguiente estructura de directorios:

/Github
 /files-example
  /.git
   /branches
   /hooks
   /info
   /logs
    /refs
     /heads
     /remotes
      /origin
   /objects
    /03
    /61
    /c6
    /info
    /pack
   /refs
    /heads
    /remotes
     /origin
    /tags
  /.settings
  /src
   /main
    /java
     /com
      /raidentrance
       /files
    /resources
   /test
    /java
    /resources
  /target
   /classes
    /com
     /raidentrance
      /files
    /META-INF
     /maven
      /com.raidentrance
       /files-example
   /test-classes

Como se pueden dar cuenta esto funciona como un árbol y no es posible conocer la profundidad del mismo así que no es posible escribir ciclos for anidados para resolver el problema.

Entendiendo las herramientas con las que contamos

Para manejar archivos en Java utilizaremos la clase File (Para más información sobre esta clase vea el post Aprende a utilizar la recursividad programando el comando tree) la cuál cuenta con los métodos listFiles() que devuelve una lista de archivos contenidos en el directorio, isFile(), isDirectory() que devuelven true o false dependiendo si el objeto es un archivo.

Veamos el programa

Una vez que entendemos el problema y las herramientas el siguiente paso es ver el código.

/**
 * 
 */
package com.raidentrance.files;

import java.io.File;
import java.io.IOException;

/**
 * @author raidentrance
 *
 */
public class TreeCommand {
	public static void printFile(File f, String spaces) {
		System.out.println(spaces.concat(File.separator).concat(f.getName()));
		if (f.isDirectory() && f.canRead()) {
			for (File file : f.listFiles()) {
				printFile(file, spaces.concat(" "));
			}
		}

	}

	public static void main(String[] args) throws IOException {
		printFile(new File("/Users/raidentrance/Documents/Github"), "");
	}
}

Analizando el programa

Analicemos línea a línea lo que hace nuestro programa:

  • public static void printFile(File f, String spaces) : Este método recibe 2 parámetros un archivo y espacios en blanco, el archivo será utilizado para imprimir su información y los espacios para determinar la viñeta y representarla en la salida
  • System.out.println(spaces.concat(File.separator).concat(f.getName())); : Se imprimen los espacios, el delimitador y el nombre del archivo, es importante mencionar se utiliza la constante File.separator debido a que cada sistema operativo utiliza uno diferente.
  • if (f.isDirectory() && f.canRead()) { :Analizamos si es un directorio o no y si contamos con los permisos para leerlo.
  • for (File file : f.listFiles()) { : iteramos todos los archivos que contiene el directorio en caso de que lo sea

  • printFile(file, spaces.concat(” “)); : El método printFile se manda a llamar a si mismo para hacer lo mismo con sus subdirectorios.

  • printFile(new File(“/Users/raidentrance/Documents/Github”), “”); : Determinamos el directorio raíz y un String para representar los espacios iniciales.

Probando el programa

Si ejecutamos el programa veremos que en la consola se imprimirán todos los archivos y carpetas del sistema operativo a los que tengamos permisos de lectura tomando como base la ruta que se pasa como parámetro en el método main.

Si te gusto este post compártelo con tus amigos y coméntanos que otros ejemplos te gustaría ver en un futuro en el blog.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

Anuncios

1 comentario »

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s