miércoles, 23 de abril de 2014

Práctica prDiccionarios en Java

Buenas gente. Aquí os traigo otra práctica. Es la segunda del pdf de prKWIC. No parece demasiado dificil, ahora lo veremos ;).

Como siempre aquí os dejo el pdf y los archivos auxiliares ( datos, frases, noClaves, Test y TestDiccionario).

Aquí os pongo el enunciado:


En esta práctica se construirá un paquete diccionarios que incluya:
· La interfaz Diccionario<C,V>,
· La clase DiccionarioDePalabras
Los diccionarios pueden ser considerados como “memorias asociativas”, que se indexan mediante claves, a diferencia de las listas, que lo hacen mediante un rango de números. Por tanto, el acceso a los valores almacenados en un diccionario se realiza a través de la clave correspondiente. Un requisito es que las claves sean únicas (dentro del mismo diccionario).
Las operaciones principales sobre un diccionario que asocia una lista de valores de tipo V a claves de tipo C son las siguientes:
boolean insertar(C,V)Añade al diccionario un valor con una clave dada; si se inserta un valor asociándolo a una clave ya existente, se añade el valor a la lista de valores asociados a la clave. Si la estructura contenía una entrada con esa clave se devuelve false; true en cualquier otro caso. Si se intenta insertar una clave null se lanzará una excepción RuntimeException.
List<V> consultar(C)Devuelve la lista de valores asociados a una clave determinada en el diccionario; si la clave que se pasa como argumento no existe en el diccionario (o es null) se devuelve null.
boolean eliminar(C)Elimina una pareja clave- lista de valores correspondiente a la clave que se pasa como argumento, devolviendo true si la clave existe y, por tanto, la operación se ha podido realizar, y false en caso contrario.
int tamaño()Devuelve el número de entradas (parejas clave-lista de valores) que incluye el diccionario.
void limpiar()Vacía el diccionario, eliminando todas sus claves.
También deberán proporcionarse dos métodos uno que devuelve una lista con todas las claves utilizadas en un diccionario (List<C> claves()), y otro que vuelca el diccionario en un fichero cuyo nombre se da como parámetro (escribirDiccionario(String nombFich)), siguiendo el formato que se da al final del enunciado.
La clase DiccionarioDePalabras implementa la interfaz Diccionario<C,V> en la que tanto las claves como los valores son de tipo String y utiliza una aplicación (Map) para almacenar los pares clave-lista de valores ordenados según el orden alfabético de sus claves.
La clase DiccionarioDePalabras tiene un constructor por defecto, y otro que tiene como parámetro el nombre de un fichero del que se leen las palabras y definiciones del diccionario con el siguiente formato:
feo:Que carece de belleza;Que causa horror o aversión;Desaire manifiesto, grosero;
bombín:Sombrero hongo;
costal:Perteneciente a las costillas;Saco grande de tela ordinaria;
arco:Porción continua de una curva;Arma hecha de una varilla de acero;
Es decir, cada palabra está separada de las definiciones por dos puntos “:”, y está seguida de una secuencia de definiciones separadas por un punto y coma “;”. Cualquier error de formato debe producir una excepción del tipo RuntimeException.
Clase ejemplo de uso:

import java.io.*;

import diccionarios.Diccionario;
import diccionarios.DiccionarioDePalabras;
public class TestDiccionario {

 public static void main(String[] args) throws IOException{
  Diccionario<String, String> dic = new DiccionarioDePalabras("datos.txt");

  System.out.println(dic.claves());
  System.out.println(dic.insertar("feo", "Horroroso"));
  System.out.println(dic.consultar("feo"));
  System.out.println(dic.consultar("arco"));
  System.out.println(dic.eliminar("arco"));
  System.out.println(dic.consultar("costal"));
  System.out.println(dic.insertar("costal", "Listón de madera"));
  System.out.println(dic.consultar("costal"));
  System.out.println(dic.tamaño());
  System.out.println(dic.consultar("bombín"));
  System.out.println(dic.claves());
  System.out.println(dic.eliminar("feo"));
  System.out.println(dic.eliminar("feo"));
  System.out.println(dic.claves());
  dic.escribirDiccionario("dic.txt");
  dic.limpiar();
  System.out.println(dic.tamaño());

 }
}


Resultado de la ejecución de la clase de ejemplo de uso:
[arco, bombín, costal, feo]
false
[Que carece de belleza, Que causa horror o aversión, Desaire manifiesto, grosero, Horroroso]
[Porción continua de una curva, Arma hecha de una varilla de acero]
true
[Perteneciente a las costillas, Saco grande de tela ordinaria]
false
[Perteneciente a las costillas, Saco grande de tela ordinaria, Listón de madera]
3
[Sombrero hongo]
[bombín, costal, feo]
true
false
[bombín, costal]
0
El fichero “dic.txt” tendría el siguiente contenido:
bombín:
Sombrero hongo
costal:
Perteneciente a las costillas
Saco grande de tela ordinaria
Listón de madera
Ahora procedo a poneros los resultados:
Primero la clase Diccionario:
import java.io.IOException;
import java.util.List;


public interface Diccionario <C, V>{ 
 public boolean insertar(C clave, V valor);
 public List <V> consultar (C clave);
 public boolean eliminar ( C clave);
 public List <C> claves();
 public void escribirDiccionario(String nomFich) throws IOException;
 public int tamaño();
 public void limpiar();

}
 


Ahora la clase DiccionarioDePalabras:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.SortedMap;
import java.util.TreeMap;


public class DiccionarioDePalabras implements Diccionario<String, String>{
 private SortedMap<String, List<String>> diccionario;
 
 public DiccionarioDePalabras(String std) throws IOException {
  diccionario = new TreeMap<String, List<String>>();
  Scanner sc = new Scanner(new File(std));
  leeDiccionario(sc);
 }
 
 private void leeDiccionario (Scanner sc) throws IOException {
  while (sc.hasNextLine()) {
   String linea = sc.nextLine();
   Scanner sPal = new Scanner(linea);
   sPal.useDelimiter(":");
   String palabra = sPal.next();
   String definicion = sPal.next();
   Scanner sSig = new Scanner(definicion);
   sSig.useDelimiter(";");
   List<String> definiciones = diccionario.get(palabra);
   if(definiciones == null) {
    definiciones = new ArrayList<String>();
    }
   while(sSig.hasNext()) {
    String def = sSig.next();
    definiciones.add(def);
   }
   diccionario.put(palabra, definiciones);
   
   //feo: Que carece de belleza; Que causa horror;
   //palabra : def1; def2; def3...
  }
  sc.close();
 }
 
 @Override
 public boolean insertar(String clave, String valor) throws RuntimeException{
  // TODO Auto-generated method stub
  boolean estaba = false;
  if(clave.equals(null)) throw new RuntimeException("Palabra no válida");
  if(diccionario.keySet().contains(clave)) {
   diccionario.get(clave).add(valor);
  } else {
   estaba = false;
   diccionario.keySet().add(clave);
   diccionario.get(clave).add(valor);
  }
  return estaba;
 }

 @Override
 public List<String> consultar(String clave) {
  // TODO Auto-generated method stub
  List<String> lista = new ArrayList<String>();
  if(diccionario.keySet().contains(clave)) {
   lista = diccionario.get(clave);
  } else {
   if(diccionario.keySet().contains(clave)) lista = null;
  }
  return lista;
 }

 @Override
 public boolean eliminar(String clave) {
  // TODO Auto-generated method stub
  return diccionario.keySet().remove(clave);
 }

 @Override
 public List<String> claves() {
  // TODO Auto-generated method stub
  List<String> lista = new ArrayList<String>();
  for(String pal : diccionario.keySet()) {
   lista.add(pal);
  }
  return lista;
 }

 @Override
 public void escribirDiccionario(String nomFich) throws IOException {
  // TODO Auto-generated method stub
  
 }

 @Override
 public int tamaño() {
  // TODO Auto-generated method stub
  return diccionario.size();
 }

 @Override
 public void limpiar() {
  // TODO Auto-generated method stub
  diccionario.clear();
 }

 
}
 

No hay comentarios:

Publicar un comentario