1
+ //DNI 48727303D PALAU ALEGRIA, JOSE MANUEL
2
+
3
+ import java .io .*;
4
+ public class DiccA {
5
+ private char [] lenguas ;
6
+ private Palabra [] dicc ;
7
+ private Palabra [] diccord ; //almacena diccionario ordenado por origen
8
+ private int last , nlenguas ; //ultima posicion libre
9
+ //constructor por defecto
10
+ public DiccA (){
11
+ dicc = new Palabra [10 ];
12
+ diccord = new Palabra [10 ];
13
+ nlenguas = -1 ;
14
+ }
15
+ //lee diccA leera el texto en el fichero que le pasaremos en f
16
+ public void leeDiccA (String f ){
17
+
18
+ FileReader fichero = null ;
19
+ BufferedReader lectura = null ;
20
+ try {
21
+ // esto podria ir al metodo abre
22
+ fichero = new FileReader (f );
23
+ lectura = new BufferedReader ( fichero );
24
+ //leo linea a linea
25
+ String linea = lectura .readLine ();
26
+ // bucle lectura hasta final de fichero
27
+ int i = 0 ;
28
+ while ( linea != null ) {
29
+ this .procesaLinea (linea , i );
30
+ linea = lectura .readLine (); // procesar linea
31
+ i ++;
32
+
33
+ }
34
+ } catch ( IOException e ){
35
+ System .err .println (" Error con archivo" );
36
+ System .exit (0 );
37
+ }
38
+ // esto podria ir al metodo cerrar
39
+ try {
40
+ if ( fichero !=null )
41
+ fichero .close ();
42
+ if ( lectura != null )
43
+ lectura . close ();
44
+ } catch (IOException ex ){
45
+ System .out .println (ex );
46
+ }
47
+ }
48
+ public void procesaLinea (String linea , int numLinea ) {
49
+
50
+ //si la linea que me llega es 0, entonces es el numero de idiomas
51
+ if (numLinea ==0 ){
52
+ nlenguas = Integer .parseInt (linea );
53
+ lenguas = new char [nlenguas ];
54
+ }
55
+ //si la linea que me llega es 1, son los idiomas de las palabras
56
+ if (numLinea ==1 ){
57
+ //defino separador " "
58
+ String separador = " " ;
59
+ //separo la linea con el separador, para tener un array de idiomas s
60
+ String [] s = linea .split ( separador ) ;
61
+ for (int i =0 ; i <nlenguas ;i ++){
62
+ //y meto los idiomas en lenguas
63
+ lenguas [i ]= s [i ].charAt (0 );
64
+ }
65
+ }
66
+ //el resto de lineas seran palabras
67
+ if (numLinea >1 ){
68
+ //defino separadores
69
+ String separador1 = "[ ]*\\ *[ ]*" ;
70
+ String separador2 = "/" ;
71
+
72
+ String [] s = linea .split (separador1 );
73
+ String [] acep ;
74
+ Palabra p =new Palabra (s [0 ], nlenguas );
75
+ p .setLenguas (lenguas );
76
+ for (int i =0 ;i <s .length -1 ;i ++){
77
+
78
+ acep = s [i +1 ].split (separador2 );
79
+ for (int j =0 ; j <acep .length ;j ++){
80
+ if (acep [j ]!=null )
81
+ p .agregaAcepcion (acep [j ], lenguas [i ]);
82
+ }
83
+ }
84
+ insertaPalabra (p );
85
+ }
86
+
87
+ }
88
+ public boolean insertaPalabra (Palabra p ){
89
+ boolean ret = true , hueco = false , encontrado = false ;
90
+ if (last < dicc .length ){
91
+ hueco = true ;
92
+ }
93
+ else {
94
+ //hago dos diccionarios auxiliares
95
+ Palabra [] diccaux = dicc ;
96
+ Palabra [] diccordaux = diccord ;
97
+ //amplio memoria, pero se borran los diccionarios
98
+ dicc = new Palabra [dicc .length +10 ];
99
+ diccord = new Palabra [dicc .length +10 ];
100
+ //copio todos los archivos de diccaux a dicc
101
+ for (int i = 0 ; i <diccaux .length ; i ++){
102
+ dicc [i ] = diccaux [i ];
103
+ diccord [i ] = diccordaux [i ];
104
+ }
105
+ hueco = true ;
106
+
107
+ }
108
+ if (hueco == true ){
109
+ //meto la palabra en dicc
110
+ for (int i =0 ; i <last ; i ++){
111
+ if (dicc [i ].comparaPalabra (p )==0 ){
112
+ dicc [i ].setLenguas (lenguas );
113
+ ret = dicc [i ].combinaPalabra (p );
114
+ encontrado = true ;
115
+ break ;
116
+ }
117
+ }
118
+
119
+ if (encontrado == true ){
120
+ //meto la palabra en diccord
121
+ for (int i =0 ; i <last ; i ++){
122
+ if (diccord [i ].comparaPalabra (p )==0 ){
123
+ if (diccord [i ].combinaPalabra (p )){
124
+ ret = true ;
125
+ };
126
+ break ;
127
+ }
128
+
129
+ }
130
+ }
131
+ if (encontrado == false ){
132
+ //si no lo encuentro, meto la palabra al final de dicc y diccord y mando a diccord a que se ordene
133
+ dicc [last ] = p ;
134
+ diccord [last ] = p ;
135
+ ordenaDiccord ();
136
+ last ++;
137
+ }
138
+ }
139
+ return ret ;
140
+ }
141
+
142
+ private void ordenaDiccord () {//ordeno usando el algoritmo de burbuja
143
+
144
+ //vamos a sacar primero el n�mero de palabras que hay en el diccionario.
145
+ int i =0 ;
146
+ Palabra aux ;
147
+ while (i <diccord .length ){
148
+ if (diccord [i ]==null ){
149
+ break ;//si encontramos la �ltima palabra insertada salimos del bucle
150
+ }
151
+ i ++;
152
+ }
153
+ for (int j =0 ;j <i ;j ++){
154
+ for (int k =0 ; k <i -1 ;k ++){
155
+ if (diccord [j ].getOrigen ().compareToIgnoreCase (diccord [k ].getOrigen ())<0 ){
156
+ aux =diccord [j ];
157
+ diccord [j ]=diccord [k ];
158
+ diccord [k ]=aux ;
159
+ }
160
+ }
161
+ }
162
+ }
163
+
164
+ public boolean borraPalabra (String s ){
165
+ boolean encontredicc =false ;
166
+ boolean encontrediccord =false ;
167
+ for (int i =0 ;i <last ;i ++){
168
+ if (encontredicc == false && s .equalsIgnoreCase (dicc [i ].getOrigen ())){
169
+ dicc [i ]=null ;
170
+ dicc [i ] = dicc [i +1 ];
171
+ for (int j = i ; j <dicc .length -1 ; j ++){
172
+ dicc [j ] = dicc [j +1 ];
173
+ }
174
+ encontredicc =true ;
175
+ }
176
+ if (encontrediccord ==false && s .equalsIgnoreCase (diccord [i ].getOrigen ())){
177
+ diccord [i ]=null ;
178
+ for (int j = i ; j <diccord .length -1 ; j ++){
179
+ diccord [j ] = diccord [j +1 ];
180
+ if (diccord [j ]==null ){
181
+ break ;
182
+ }
183
+
184
+ }
185
+ encontrediccord =true ;
186
+ last --;
187
+ }
188
+ }
189
+
190
+ return encontrediccord ;
191
+ }
192
+ public int busqueda (String s ){
193
+ for (int i =0 ;i <last ;i ++){
194
+ if (s .equalsIgnoreCase (dicc [i ].getOrigen ())){
195
+ return i ;
196
+ }
197
+ }
198
+
199
+ return -1 ;
200
+ }
201
+ public int busquedaOptima (String s ){
202
+ //este método busca la cadena s en el diccionario y devuelve las comparaciones que tuvo que hacer (pero óptimamente)
203
+ //para este caso implementaré una búsqueda binaria, consistente en dividir el array en dos para averiguar en que zona está del array
204
+
205
+ int centro , max =last -1 , min =0 , i =0 ;
206
+ //centro será el centro de donde estoy buscando
207
+ //max es el rango máximo que estoy buscando
208
+ //min es el rango mínimo
209
+ //i es el número de iteracciones que realiza el programa
210
+ while (min <=max ){
211
+ i ++;
212
+ centro =(max +min )/2 ;
213
+ if (diccord [centro ].getOrigen ().compareToIgnoreCase (s )==0 ){ //si me devuelve 0, las palabras son las mismas, y no tengo que buscar más
214
+ return i ;
215
+ }
216
+ else {
217
+ if (diccord [centro ].getOrigen ().compareToIgnoreCase (s )>0 ){//se devuelve un número mayor que uno, el objeto del diccionario es mayor que el que me pasan
218
+ max =centro -1 ; //y por tanto, no estará más arriba que en el centro.
219
+ }
220
+ else { //si devuelve un número menor que uno, la palabra buscada no estará más abajo del centro
221
+ min =centro +1 ; // y por tanto el mínimo pasará a ser el centro
222
+ }
223
+ }
224
+ }
225
+ return -1 ;
226
+
227
+ }
228
+
229
+ public String traduce1 (String s , char l ){
230
+ String traduc = null ;
231
+ for (int i = 0 ; i <last ; i ++){
232
+ if (s .equalsIgnoreCase (dicc [i ].getOrigen ())){
233
+ traduc = dicc [i ].getTraduccion (l );
234
+ }
235
+ }
236
+ return traduc ;
237
+ }
238
+ public String traduce2 (String s , char l ){
239
+ //busca en el diccionario la palabra s y devuelve todas las traducciones
240
+ //primero buscaré la palabra con el código de búsqueda óptima
241
+ int centro , max =last -1 , min =0 ;
242
+ //centro será el centro de donde estoy buscando
243
+ //max es el rango máximo que estoy buscando
244
+ //min es el rango mínimo
245
+ //i es el número de iteracciones que realiza el programa
246
+ while (min <=max ){
247
+ centro =(max +min )/2 ;
248
+ if (diccord [centro ].getOrigen ().compareToIgnoreCase (s )==0 ){ //si me devuelve 0, las palabras son las mismas, y no tengo que buscar más
249
+ return diccord [centro ].getTraducciones (l ); //devuelvo todas las traducciones de la palabra
250
+ }
251
+ else {
252
+ if (diccord [centro ].getOrigen ().compareToIgnoreCase (s )>0 ){//se devuelve un número mayor que uno, el objeto del diccionario es mayor que el que me pasan
253
+ max =centro -1 ; //y por tanto, no estará más arriba que en el centro.
254
+ }
255
+ else { //si devuelve un número menor que uno, la palabra buscada no estará más abajo del centro
256
+ min =centro +1 ; // y por tanto el mínimo pasará a ser el centro
257
+ }
258
+ }
259
+ }
260
+
261
+ return null ;
262
+
263
+ }
264
+ public void muestraDiccA (int i ){
265
+ if ( i == 0 ){
266
+ for (int j = 0 ; j <last ; j ++){
267
+ dicc [j ].escribeInfo ();
268
+ }
269
+ }
270
+ if ( i == 1 ){
271
+ for (int j = 0 ; j <last ; j ++){
272
+ if (diccord [j ]!=null ){
273
+ diccord [j ].escribeInfo ();
274
+ }
275
+ }
276
+ }
277
+
278
+ }
279
+
280
+ public void muestraDiccA (int i , int j ){
281
+ if ( i == 0 ){
282
+ for (int l = 0 ; l <last && l <j ; l ++){
283
+ dicc [l ].escribeInfo ();
284
+ }
285
+ }
286
+ if ( i == 1 ){
287
+ for (int l = 0 ; l <last && l <j ; l ++){
288
+ if (diccord [l ]!=null ){
289
+ diccord [l ].escribeInfo ();
290
+ }
291
+ }
292
+ }
293
+
294
+ }
295
+
296
+ public void muestraDiccA (int i , int j , char l ){
297
+ if ( i == 0 ){
298
+ for (int k = 0 ; k <last && k <j ; k ++){
299
+ System .out .print (dicc [k ].getOrigen ()+":" );
300
+ if (dicc [k ].getTraducciones (l )!=null ){
301
+ System .out .println (dicc [k ].getTraduccion (l ));
302
+ }
303
+ else {
304
+ System .out .println ();
305
+ }
306
+ }
307
+ }
308
+ if ( i == 1 ){
309
+ for (int k = 0 ; k <last && k <j ; k ++){
310
+ if (diccord [k ]!=null ){
311
+ System .out .print (diccord [k ].getOrigen ()+":" );
312
+ if (diccord [k ].getTraducciones (l )!=null ){
313
+ System .out .println (diccord [k ].getTraduccion (l ));
314
+ }
315
+ else {
316
+ System .out .println ();
317
+ }
318
+
319
+ }
320
+ }
321
+ }
322
+
323
+ }
324
+ public char [] devuelveLengua () {
325
+ return lenguas ;
326
+ }
327
+
328
+ }
0 commit comments