[JAVA] Hashmap y diccionario

willy_chaos

Hola a todos, estoy mirando como hacer un diccionario el cual sera solo de lectura (vamos que no se pueden añadir nuevas palabras) y estas vienen en un txt estilo:

spoiler

Como se puede ver hay palabras repetidas (Banc) del cual tiene diferente significado. Pero segun tengo entendido un hashmap no puede repetir clave. Como podria hacer esto ?

A priori se me ha ocurrido poner como clave directamente (por ejemplo) "clave - numero" pero a la hora de buscar, tendria que ir buscando la primera con el numero 1, luego la clave con el numero dos, y si no retorna nada pues no mostrar el segundo significado.

benjajim

Puedes usar librerias externas?

Si es asi prueba con MultiMap en vez de con Hashmap

http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/Multimap.html

willy_chaos

No, la verdad es que no podemos usarlas.

De momento he hecho esto y parece que va por buen camino.

public class Diccionari {
	private int numparaules;
	
private HashMap map = new HashMap();

public Diccionari(){
	this.loadData("a");
}

public void loadData(String url) {
	
	
	map.put("Sol - 1","Descripcio Astre.Sin estrella.Ant lluna.");
	map.put("Senyor - 1","Descripcio Persona, home molt masculi.Sin gentelman, educat, caballeros.Ant mal educat.");
	map.put("Senyora - 1","Descripcio Persona, dona molt masculi.Sin gentelman, educat, caballeros.Ant mal educat.");
	map.put("Banc - 1", "Descripcio De peixos.Sin grup.Ant individual.");
	map.put("Banc - 2", "Descripcio Descripcio Lloc on diposites o extreus diners.Sin lladres, guardiola.");
	
	
	
}

public void searchData(String key) {
	
	int i = 1;
	boolean continuar = true;
	System.out.println("Paraula "+key.toUpperCase());
	while (continuar) {
		try {
			
			System.out.println("\t"+map.get(key+" - "+i).toString());
			i++;
		} catch (Exception e) {
			continuar = false;
			if ( i == 1) {
				System.out.println("\tERROR: No existeix la paraula");
			}
		}
	}
}

}

De momento se los he puesto a mano para hacer pruebas, cuando termine ya me hare el codigo para leer del fichero txt.

1 respuesta
r2d2rigo

Ahora mismo no recuerdo que tipos de datos hay en Java, pero en .NET los diccionarios son genericos; en ese caso con un Dictionary<string, List<string>> estaria solucionado. Mira a ver si tienes una aproximacion disponible.

1 respuesta
Lecherito

Claro, puede hacer un HashMap<String, ArrayList<String>>.

Mirando a ver si existe, y si existe añadirle una entrada a ese arraylist

MTX_Anubis

#4 En java también :P

Lo idea es (java 8):

Map<String,List<String>> map = HashMap<>() ;

Por cierto #3, con java 8 tienes funciones lambda que para trabajar con colecciones es bastante más comodo

Suponiendo que lo tengas declarado como arriba:

if (map.containsKey(key)) {
    map.get(key).stream().forEach(text -> System.out.println(text));
} else {
    System.out.println("\tERROR: No existeix la paraula");
}
willy_chaos

Aprovecho para comentaros una cosa que me estoy encontrando.

Como coño separo una string por puntos...

spoiler

Hay algun problema con el split y el punto ?

Edit: Me autorespondo... por lo visto hay que escaparlo

hola.split("\\.");
1 respuesta
Lecherito

#7 El split de java funciona con una expresión regular, en una expresión regular el . es el "comodín" por lo que has de escaparlo, sería . pero la barra es especial por lo que también hay que escaparla y el caracter para escapar es la misma barra por lo que \.

JuAn4k4

Hola,

En realidad no son palabras repetidas, sino una misma palabra con distintas acepciones o significados de una misma palabra.

HashMap<String, List<String>>

o definirte tu una clase "Palabra" que dentro tenga una lista de "Acepciones".

HashMap<String, Palabra>

public class Palabra {
 
  private List<Acepcion> acepciones;

  ..

}

De esta forma si buscas "banco" te saldrán todas las acepciones de banco, de la otra forma tendrás que buscar "Banco", "Banco - 1", "Banco - 2", etc. (No te será muy práctico).

Tienes varias posibilidades

willy_chaos

Gracias a todos por las respuestas, de momento lo he hecho asi para entregarlo.

En teoría no podía usar una clase que guardara dentro un Arraylist o cualquier estructura del tipo puesto que a un compañero le ha echado atrás la practica por eso...

Yo creo que la mejor forma hubiera sido esa, usar un objeto y dentro el listado de acepciones. Lo cual me parece mas ordenado y orientado a objetos como es java... pero bueno.

Saludos y gracias!

JuAn4k4

Y no podías usar esto tampoco :

Map<String,List<String>> map = HashMap<>() ;

?

Mierda de profesores..

1 respuesta
Tig

Consejo totalmente off-topic: programa en inglés. Es muy probable que en el futuro trabajes con extranjeros. Cuanto antes te acostumbres a expresarte en inglés, mejor

1 respuesta
willy_chaos

#12 Normalmente lo hago pero este profe da todo en catalan y sin darme cuenta XDDD pues le he puesto cosas en catalán (salvo los comentarios que si que estan puestos para que el los lea).

Aunque me pasa mucho que comienzo a hacerlo en ingles, sigo en castellano, luego vuelvo a ingles xDDD. Todo consejo es bienvenido ! Gracias a todos!

#11 pues no sabria decirte si eso me lo aceptaria... la cosa es que en teoria lo podiamos hacer en C (no c++ ni c#) y Java por lo que entiendo que no quiere que usemos cosas "faciles". Es la asignatura de algoritmia y optimizacion aunque bueno , tampoco se ha volcado mucho en optimizacion...

1 respuesta
11 días después
JuAn4k4

#13 ¿ No será que quiere que implementes un HashMap tu en lugar de usar la clase ya hecha de Java ?

Usuarios habituales

  • JuAn4k4
  • willy_chaos
  • Tig
  • Lecherito
  • MTX_Anubis
  • r2d2rigo
  • benjajim