* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * $Id: Traductor.java,v 1.1 2008/01/24 00:10:51 cupi3 Exp $ * Universidad de los Andes (Bogotá - Colombia) * Departamento de Ingeniería de Sistemas y Computación * Licenciado bajo el esquema Academic Free License version 2.1 * * Proyecto Cupi2 (http://cupi2.uniandes.edu.co) * Ejercicio: n7_traductor * Autor: Daniel Francisco Romero - 27-jun-2006 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ package uniandes.cupi2.traductor.servidor; import java.io.serializable; import java.util.arraylist; * Traductor de palabras de español, inglés, francés e italiano. <br> * <b>inv: </b> <br> * espanolingles!= null <br> * espanolfrances!= null <br> * espanolitaliano!= null <br> * * En el vector espanolingles no hay palabras repetidas <br> * En el vector espanolfrances no hay palabras repetidas <br> * En el vector espanolitaliano no hay palabras repetidas <br> * * En el vector espanolingles no hay traducciones repetidas <br> * En el vector espanolfrances no hay traducciones repetidas <br> * En el vector espanolitaliano no hay traducciones repetidas public class Traductor implements Serializable // Constantes * private static final long serialversionuid = 1L; 1 / 9
* Idioma inglés public final static int INGLES = 0; * Idioma francés public final static int FRANCES = 1; * Idioma italiano public final static int ITALIANO = 2; * Idioma español public final static int ESPANOL = 3; // Atributos * Conjunto de traducciones del español al inglés private ArrayList espanolingles; * Conjunto de traducciones del español al francés private ArrayList espanolfrances; * Conjunto de traducciones del español al italiano private ArrayList espanolitaliano; // Constructores * Crea al traductor con los diccionarios vacíos. <br> * <b> post: </b> Se creó el traductor con los diccionarios vacíos. 2 / 9
public Traductor( ) espanolingles = new ArrayList( ); espanolfrances = new ArrayList( ); espanolitaliano = new ArrayList( ); // Verifica el invariante verificarinvariante( ); // Métodos * Agrega al diccionario una traducción de una palabra en español a un idioma dado. <br> * <b> post: </b> La traducción fue adicionada al diccionario del idioma especificado. * @param pal es la palabra - pal!= null y pal!= "" * @param trad es la traducción - trad!= null y trad!= "" * @param iddestino es el idioma destino - iddestino pertenece a FRANCES, INGLES, ITALIANO * @return True si la palabra pudo ser adicionada al diccionario o false en caso contrario. public boolean agregartraduccion( String pal, String trad, int iddestino ) boolean agregada = false; // Busca la palabra en el diccionario del idioma Traduccion latraduccion = traducirdeespanol( pal, iddestino ); // Verifica que la palabra ni la traducción existan if( latraduccion == null &&!existetraduccion( iddestino, trad ) ) // Obtiene el arreglo de las traducciones correspondientes al idioma ArrayList traducciones = obtenerdiccionario( iddestino ); // Agrega la palabra con su traducción al diccionario traducciones.add( new Traduccion( pal, trad ) ); agregada = true; // Verifica el invariante verificarinvariante( ); // Indica si la palabra fue agregada return agregada; * Dada la palabra de búsqueda y el idioma al que se quiere traducir, retorna la traducción 3 / 9
correspondiente. <br> * @param palabra es la palabra a buscar - palabra!= null y palabra se encuentra en español * @param idiomatraduccion es el idioma al que se va a traducir la palabra - idiomatraduccion pertenece FRANCES, INGLES, ITALIANO * @return Traducción de la palabra en el idioma solicitado. Si no encuentra la palabra retorna null private Traduccion traducirdeespanol( String palabra, int idiomatraduccion ) // Obtiene el arreglo de traducciones correspondiente al idioma de traducción ArrayList traducciones = obtenerdiccionario( idiomatraduccion ); Traduccion traduccion = null; // Busca la palabra como palabra base en las traducciones for( int i = 0; i < traducciones.size( ) && traduccion == null; i++ ) Traduccion aux = ( Traduccion )traducciones.get( i ); if( aux.darpalabra( ).equalsignorecase( palabra ) ) traduccion = aux; return traduccion; * Según el idioma retorna el diccionario correspondiente. <br> * @param idiomatraduccion es el idioma de la traducción - idiomatraduccion pertenece FRANCES, INGLES, ITALIANO * @return Arreglo con las traducciones del español al idioma dado. Si no se maneja esa traducción retorna null private ArrayList obtenerdiccionario( int idiomatraduccion ) switch( idiomatraduccion ) case INGLES: return espanolingles; case ITALIANO: return espanolitaliano; case FRANCES: return espanolfrances; default: return null; * Indica si la traducción especificada ya existe en el diccionario del idioma dado. <br> 4 / 9
* <b> post: </b> Se retornó true si la traducción ya se encuentra asignada o false de lo contrario. * @param idiomatraduccion es el idioma del diccionario - idiomatraduccion pertenece FRANCES, INGLES, ITALIANO * @param traduccion es la traducción a ser buscada en el diccionario - traducion!=null * @return True si la traducción ya se encuentra asignada o false de lo contrario. private boolean existetraduccion( int idiomatraduccion, String traduccion ) boolean existe = false; ArrayList traducciones = obtenerdiccionario( idiomatraduccion ); // Recorre el diccionario buscando si hay palabras con la misma traducción for( int i = 0; i < traducciones.size( ) &&!existe; i++ ) Traduccion t = ( Traduccion )traducciones.get( i ); String palabratraducida = t.dartraduccion( ); if( palabratraducida.equalsignorecase( traduccion ) ) existe = true; return existe; * Dada una palabra, el idioma en el que está y el idioma al que se quiere traducir, este método retorna la traducción correspondiente. Para que la traducción exista entre * dos idiomas diferentes es necesario que la traducción de la palabra exista en los dos idiomas implicados. Así por ejemplos para traducir una palabra de francés a inglés * es necesario que exista la traducción en el diccionario de español-francés y que la traducción de la palabra en español exista el diccionario español-inglés. <br> * @param pal es la palabra - pal!= null * @param idorigen es el idioma de origen - idorigen pertenece a FRANCES, INGLES, ITALIANO, ESPANOL * @param iddestino es el idioma destino - iddestino pertenece a FRANCES, INGLES, ITALIANO, ESPANOL * @return Traducción de la palabra en el idioma destino. Si no existe, retorna null. public Traduccion traducir( String pal, int idorigen, int iddestino ) // Solo se realiza la traducción si los dos idiomas son diferentes if( idorigen!= iddestino ) if( idorigen == ESPANOL ) return traducirdeespanol( pal, iddestino ); else if( iddestino == ESPANOL ) 5 / 9
return traduciraespanol( pal, idorigen ); else Traduccion aux = traduciraespanol( pal, idorigen ); if( aux!= null ) return traducirdeespanol( aux.darpalabra( ), iddestino ); return null; * Dada la palabra de búsqueda y el idioma en el que se encuentra, retorna la traducción correspondiente al español. <br> * @param palabra es la palabra a buscar - palabra!= null * @param idiomaorigen es el idioma en el que se encuentra la palabra - idiomaorigen pertenece FRANCES, INGLES, ITALIANO * @return Traducción de la palabra en español - Si no encuentra la traducción retorna null private Traduccion traduciraespanol( String palabra, int idiomaorigen ) // Obtiene el arreglo de traducciones correspondiente al idioma origen ArrayList traducciones = obtenerdiccionario( idiomaorigen ); Traduccion traduccion = null; // Busca la palabra como la traducción en el diccionario for( int i = 0; i < traducciones.size( ) && traduccion == null; i++ ) Traduccion aux = ( Traduccion )traducciones.get( i ); if( aux.dartraduccion( ).equalsignorecase( palabra ) ) traduccion = aux; return traduccion; * Retorna el número de palabras del diccionario de un idioma dado. <br> * @param iddestino es el idioma destino - iddestino pertenece a FRANCES, INGLES, FRANCES * @return Número de palabras en el diccionario public int dartotalpalabrastraducidas( int iddestino ) // Obtiene el arreglo de traducciones correspondiente ArrayList traducciones = obtenerdiccionario( iddestino ); 6 / 9
if( traducciones == null ) return 0; else return traducciones.size( ); // Invariante * Indica si hay palabras repetidas en el diccionario del idioma dado. <br> * @param idtrad es el idioma del diccionario - idtrad pertenece a FRANCES, INGLES, ITALIANO * @return True si hay al menos una palabra repetida o false en caso contrario. private boolean haypalabrasrepetidas( int idtrad ) Traduccion traduccion; Traduccion otratraduccion; String palabra; ArrayList traducciones = obtenerdiccionario( idtrad ); // Recorre las traducciones buscando si hay palabras repetidas for( int i = 0; i < traducciones.size( ) - 1; i++ ) traduccion = ( Traduccion )traducciones.get( i ); palabra = traduccion.darpalabra( ); for( int j = i + 1; j < traducciones.size( ); j++ ) otratraduccion = ( Traduccion )traducciones.get( j ); if( palabra.equalsignorecase( otratraduccion.darpalabra( ) ) ) return true; return false; * Indica si hay palabras con la misma traducción en el diccionario del idioma dado. <br> * @param idtrad es el idioma del diccionario - idtrad pertenece a FRANCES, INGLES, ITALIANO * @return True si hay dos palabras con la misma traducción o false en caso contrario. private boolean haytraduccionesrepetidas( int idtrad ) 7 / 9
Traduccion traduccion; Traduccion otratraduccion; String palabratraducida; ArrayList traducciones = obtenerdiccionario( idtrad ); // Recorre las traducciones buscando si hay palabras con la misma traducción for( int i = 0; i < traducciones.size( ) - 1; i++ ) traduccion = ( Traduccion )traducciones.get( i ); palabratraducida = traduccion.dartraduccion( ); for( int j = i + 1; j < traducciones.size( ); j++ ) otratraduccion = ( Traduccion )traducciones.get( j ); if( palabratraducida.equalsignorecase( otratraduccion.dartraduccion( ) ) ) return true; return false; // Invariante * Verifica que el invariante de la clase se cumpla. Si algo falla, lanza un AssertError.<br> * <b>inv: </b> <br> * espanolingles!= null <br> * espanolfrances!= null <br> * espanolitaliano!= null <br> * En el diccionario español-inglés no hay palabras repetidas <br> * En el diccionario español-francés no hay palabras repetidas <br> * En el diccionario español-italiano no hay palabras repetidas private void verificarinvariante( ) assert espanolingles!= null : "Diccionario español-ingles sin inicializar"; assert espanolfrances!= null : "Diccionario español-francés sin inicializar"; assert espanolitaliano!= null : "Diccionario español-italiano sin inicializar"; assert!haypalabrasrepetidas( INGLES ) : "Palabras repetidas en el diccionario de inglés"; assert!haypalabrasrepetidas( FRANCES ) : "Palabras repetidas en el diccionario de francés" ; assert!haypalabrasrepetidas( ITALIANO ) : "Palabras repetidas en el diccionario de italiano" ; 8 / 9
assert!haytraduccionesrepetidas( INGLES ) : "Traducciones repetidas en el diccionario de inglés" ; assert!haytraduccionesrepetidas( FRANCES ) : "Traducciones repetidas en el diccionario de francés" ; assert!haytraduccionesrepetidas( ITALIANO ) : "Traducciones repetidas en el diccionario de italiano" ; // Puntos de Extensión * Ejecuta el punto de extensión 1 * @return respuesta 1 public String metodo1( ) return "respuesta1"; * Ejecuta el punto de extensión 2 * @return respuesta 2 public String metodo2( ) return "respuesta2"; 9 / 9