FUNDAMENTOS DE PROGRAMACIÓN Curso: 2010/11 UNIDAD DIDÁCTICA 21: EJERCICIOS DE ITERABLES COMPLEJOS Versión: 1.0.0 EJERCICIOS DE ITERABLES COMPLEJOS 1. En una clase de utilidad EjerciciosIterablesUD21 escriba los siguientes métodos SIN UTILIZAR NINGÚN BUCLE: a. Un método que devuelva un Iterable<Integer> a partir de un fichero de texto que contiene en cada línea una lista de números enteros separados por comas. La signatura del método será: public static Iterable<Integer> obtenerIterableEnteros(String nomFich); Para resolver el ejercicio use un método privado auxiliar que se encargue de devolver un Iterable<String> que itere sobre todos los números almacenados en el fichero. El método tomará como parámetro de entrada un Iterable<String> que itere sobre cada línea del fichero y una cadena que indique cuáles van a ser los separadores que se usarán para trocear cada línea. La signatura del método debe ser la siguiente: private static Iterable<String> aplana(Iterable<String> itLinea, String separadores); b. Un método que dado el nombre de un fichero, devuelva un Iterable<String> que vaya iterando sobre las palabras del fichero. La signatura del método será: public static Iterable<String> iterablePalabrasFichero (String nomFich); Considere usar el método auxiliar definido en el apartado anterior. 2. Los buscadores como Google, para prestar el servicio de búsqueda de información, realizan dos procesos distintos. El primer proceso se conoce como indexación y consiste en generar una serie de índices de búsqueda, como por ejemplo, un índice invertido. El segundo proceso es el de búsqueda, que se basará en los índices de búsqueda generados en la etapa anterior. Se quiere generar un índice invertido, tal y como lo hacen los buscadores, para ayudar en la búsqueda de información dentro de una serie de archivos. Un índice invertido es una colección de todas las palabras existentes en un conjunto de documentos, de tal forma que cada palabra tiene asociado un conjunto con todos los documentos en los que aparece (Figura 1). Algunos libros incluyen este tipo de índice al final de sus páginas, de forma que se listan todas las palabras relevantes y las páginas donde aparece cada una de ellas. Como ejemplo, suponga que tiene tres archivos, cada uno de ellos conteniendo uno de los textos que se muestran a continuación: Texto 1: “Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems” Texto 2: “Las aplicaciones Java están compiladas en un bytecode” Texto 3: “Sun Microsystems proporciona una implementación GNU General Public License de un compilador Java y una máquina virtual Java” La estructura del índice invertido para un conjunto de búsqueda formado por estos tres archivos será (NOTA: puede mirar también la Figura 1): Palabra Aparece en GNU Texto3.txt Java Texto1.txt, Texto2.txt, Texto3.txt Microsystems Texto1.txt, Texto3.txt ... El tipo IndiceInvertido tiene las siguientes propiedades, que se reflejan en la interfaz que aparece en la Figura 2: aplicacion, de tipo Map<String, Set<String>>, solo consultable, en la que el conjunto de claves de la aplicación representa una palabra, y los valores son conjuntos con los nombres de los archivos en los que aparece esa palabra. configIteracion, de tipo Integer, consultable y modificable. Esta propiedad representa un número que ha de ser mayor o igual que cero y que permite configurar cómo se iterará por el Unidad Didáctica 21: Ejercicios de Iterables Complejos 2 índice invertido. Si este número es cero, se iterará sobre todas las palabras del conjunto de claves, mientras que si es un número n mayor que cero se iterará sobre aquellas palabras que aparecen en más de n documentos. Texto3.txt public interface IndiceInvertido extends Iterable<String>{ Map<String,Set<String>> getAplicacion(); Integer configIteracion(); void setConfigIteracion(Integer num); void indexaArchivo(String nomFich); } GNU Texto1.txt Texto2.txt Texto3.txt Java Microsystems Texto1.txt Texto3.txt CLAVES VALORES Figura 1. Índice invertido Figura 2. Tipo IndiceInvertido Se pide implementar la clase IndiceInvertidoImpl y una clase de utilidad IndicesInvertidos en la que se definan una serie de métodos para ayudar en la fase de búsqueda de los buscadores, tal como se indica en los siguientes apartados. Para la clase IndiceInvertidoImpl a. Escriba los atributos y los métodos consultores y modificadores. b. Añada un constructor por defecto. c. Para implementar el método iterator() defina un método privado auxiliar que dado un número n, devuelta un Iterable<String> que permita iterar sobre aquellas palabras del conjunto de claves que aparecen en más de n archivos, y que tenga la signatura: private Iterable <String> iterablePalabrasMasNDocs(Integer n); d. El método indexaArchivo se encarga de cargar el archivo que tiene como parámetro en la aplicación. Para implementarlo, use un método privado auxiliar que dado un nombre de fichero devuelva un Iterable<String> que permita iterar sobre cada una de las palabras de ese fichero, y que tenga la signatura: private Iterable<String> iterablePalabrasFichero(String nomFich); En la clase IndicesInvertidos escriba los métodos: e. Un método para responder a la pregunta ¿Cuál es la palabra del índice que comienza por “Ja” y se encuentra en más archivos? El método debe tener la siguiente cabecera: public static String palabraPrefijoMasDocs(IndiceInvertido ii, String prefijo); f. Un método que dado un índice invertido y un conjunto con palabras, devuelva un conjunto con los nombres de aquellos ficheros en los que aparece alguna de las palabras del conjunto. La signatura del método ha de ser la que se muestra más abajo. Implemente dos versiones de este método, una en la que no use NINGÚN BUCLE y otra en la que no use ninguna artillería de guava. public Set<String> ficherosConAlgunaDeLasPalabras(IndiceInvertido ii, Set<String> conjPals);