/** * 6) Colección ordenada de todas las sentencias que aparecen en el almacén. * * @return Un array con las sentencias del almacén según el orden descrito en el enunciado */ public ListaArray<String> sentenciasOrdenadas() { ListaArray<Integer> valores = arbolSujetosObjetos.recorrerEnProfundidad(); ListaArray<String> sentenciasEnOrden = new ListaArray<String>(sentencias); int nodo; Arista arista; for (int i = 0; i < valores.size(); ++i) { nodo = valores.get(i); for (int j = 0; j < nodosSalientesOrdenados.get(nodo).size(); ++j) { arista = nodosSalientes.get(nodo).get(nodosSalientesOrdenados.get(nodo).get(j)); for (int k = 0; k < arista.repeticiones; ++k) sentenciasEnOrden.insertLast( listaSujetosObjetos.get(nodo) + " " + listaPropiedades.get(arista.propiedad) + " " + listaSujetosObjetos.get(arista.verticeObjetivo) + " ."); } } return sentenciasEnOrden; }
/** * Constructora Carga las sentencias en el almacén desde el fichero especificado. * * @param nombreDeArchivo de texto desde el que leer las entidades */ private Almacen(String nombreDeArchivo) throws IOException { // Inicializa los atributos de la clase nodosEntrantes = new ListaArray<ListaArray<Arista>>(); nodosSalientes = new ListaArray<ListaArray<Arista>>(); sujetos = objetos = propiedades = sentencias = 0; arbolSujetosObjetos = new Trie(); arbolPropiedades = new Trie(); listaSujetosObjetos = new ListaArray<String>(); listaPropiedades = new ListaArray<String>(); // Variables auxiliares int tempArista; Arista a; // Lee las sentencias desde el fichero y las añade al trie y a la lista de nodos del grafo Fichero.abrir(nombreDeArchivo, false, false); String sentencia, sujeto, propiedad, objeto; int idSujeto, idPropiedad, idObjeto; StringTokenizer tokenizador; sentencia = Fichero.leerSentencia(); while (sentencia != null) { tokenizador = new StringTokenizer(sentencia); sujeto = tokenizador.nextToken(); propiedad = tokenizador.nextToken(); objeto = tokenizador.nextToken(); sentencias++; // Insertar sujeto en el trie idSujeto = arbolSujetosObjetos.insertar(sujeto, sujetos + objetos); if (idSujeto == sujetos + objetos) { // Agregar al array de int -> String listaSujetosObjetos.insertLast(sujeto); // Añadir su hueco en las listas de adyacencia nodosEntrantes.insertLast(new ListaArray<Arista>()); nodosSalientes.insertLast(new ListaArray<Arista>()); // Incrementar contador sujetos++; } // Insertar propiedad en el trie idPropiedad = arbolPropiedades.insertar(propiedad, propiedades); if (idPropiedad == propiedades) { // Agregar al array de int -> String listaPropiedades.insertLast(propiedad); // En caso de ser una propiedad especial, guardar su valor entero if (propiedad.equals(propiedadEs)) idPropiedadEs = idPropiedad; else if (propiedad.equals(propiedadSubClaseDe)) idPropiedadSubClaseDe = idPropiedad; else if (propiedad.equals(propiedadCursa)) idPropiedadCursa = idPropiedad; else if (propiedad.equals(propiedadEncargadoDe)) idPropiedadEncargadoDe = idPropiedad; else if (propiedad.equals(propiedadDepartamentoDe)) idPropiedadDepartamentoDe = idPropiedad; else if (propiedad.equals(propiedadTrabajaPara)) idPropiedadTrabajaPara = idPropiedad; // Incrementar contador propiedades++; } // Insertar objeto en el trie idObjeto = arbolSujetosObjetos.insertar(objeto, sujetos + objetos); if (idObjeto == sujetos + objetos) { // Agregar al array de int -> String listaSujetosObjetos.insertLast(objeto); // Añadir su hueco en las listas de adyacencia nodosEntrantes.insertLast(new ListaArray<Arista>()); nodosSalientes.insertLast(new ListaArray<Arista>()); // Incrementar contador objetos++; } // Inserta la arista en la primera lista de adyacencia, o añade una repetición tempArista = nodosSalientes.get(idSujeto).find(new Arista(idObjeto, idPropiedad)); if (tempArista == -1) nodosSalientes.get(idSujeto).insertLast(new Arista(idObjeto, idPropiedad)); else nodosSalientes.get(idSujeto).get(tempArista).repeticiones++; // Lee la siguiente sentencia sentencia = Fichero.leerSentencia(); } Fichero.cerrar(); // Crear la segunda lista de adyacencia a partir de la primera for (int i = 0; i < nodosSalientes.size(); i++) { for (int j = 0; j < nodosSalientes.get(i).size(); j++) { a = nodosSalientes.get(i).get(j); nodosEntrantes .get(a.verticeObjetivo) .insertLast(new Arista(i, a.propiedad, a.repeticiones)); } } // Ordenar las aristas salientes de cada nodo nodosSalientesOrdenados = new ListaArray<ListaArray<Integer>>(nodosSalientes.size()); for (int i = 0; i < nodosSalientes.size(); ++i) nodosSalientesOrdenados.set(i, nodosSalientes.get(i).sort()); }