Unidad 21: Ejercicios de Iterables Complejos

Anuncio
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);
Descargar