Seems Apt.
Cosimo Galluzzi

izzy's playlists!
Jules of Nature

★
untitled
trying on a metaphor
I'd rather be in outer space 🛸
art blog(derogatory)


oozey mess

Discoholic 🪩
noise dept.

❣ Chile in a Photography ❣
Sweet Seals For You, Always
will byers stan first human second

d e v o n

if i look back, i am lost

@theartofmadeline

seen from Ecuador

seen from United Kingdom

seen from United States
seen from United States
seen from United States

seen from United States
seen from Saudi Arabia
seen from United States
seen from Hong Kong SAR China
seen from Chile

seen from United Kingdom

seen from Belgium
seen from Bangladesh
seen from Sweden
seen from United States
seen from France
seen from United States
seen from Germany

seen from United States
seen from United States
@estdatosespol-blog
Seems Apt.

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Estructura de Datos - Proyecto 1; Tercer Post
Un metodo que construi fue el de cargarDEsdeResumen(), que lo que hace es leer el Resumen (si existe) para cargar la ArrayList<Movie> peliculas con la informacion pertinente, en vez de usar lo 17700 archivos, que se tardan en leer.
EXPLICAR COMO FUNCIONABA ESTE METODO CON EL METODO MAIN EN LA VERSION ANTES DEL GUI (COMOS SE SABIA SI YA EXISTIA UN ARCHIVO RESUMEN, ETC)
Estructura de Datos - Proyecto 1; Segundo Post
CoinciEn el ultimo post nos habiamos quedado en la segunda solucion que Leonardo y yo propusimos para el lento desempeño de nuestro programa. La nueva solucion seria crear una clase Calificaciones que guardada un rating (1-5 estrellas), la fecha cuando fue hecha y el ID del Cliente que la hizo. Asi, la clase Pelicula tendria una lista de Calificaciones, basicamente eflejando la forma en que esta organizada la informacion en los archivos. Desafortunadamenete cuando imlementamos esta solucion, nos topamos con un problema que otros grupos tambien encontraron: el OutOfMemoryException.
Resulta que representar toda esta informacion, de la manera que esta organizda en los archivos, a traves de alses y lista enlazadas e implementadas con arreglos, toma mucho espacio. Fue aqui cuando el poryectose cambio a uno que era posible haver solo con las estructuras de datos que hemos aprendido hasta ahora.
En el nuevo proyecto, ya no tenemos que poder buscar los ratings hechos por un cliente, sino hacer un resumen de las peliculas en los archivos. Las otras funcionalidades del programa (como mostrat peliculas por oder descendiente de rating y los top 10 de cada categoria) siguen en pie.
Con esto en mente, empezamos a planear el proyecto. Como ya teniamos el TDA Movie y el TDA Calificacion hechos, la mayoria de funcionalidades ya estaban implementadas. Lo unio que faltaba era que los metodos crearan una pagina html con los datos y abrieran al terminar el metodo, ya que la mayoria de estos metodos imprimian por pantalla los resultados.
Arriba podran observar dos de los metodos que representan funcionalidades del programa. El primero retorna un ArrayList con las peliculas ordenadas descendentemente por Rating, la cual se imprimen en el metodo main(). El segundo Imprime los rresultados de una busqueda.
Mi trabajo aqui fue crear los archivos html. Para esto decidi crear unos archivos con diseño bien simple y funcional, para despues mejorarlo si habia tiempo.
Para esto decidi no usar tablas en el codigo html (<table>), y en vez decidi usar las tags <pre> que muestra el texto entre ellas con el formato en el que aparecen (http://www.w3schools.com/html/html_paragraphs.asp) junto con los metodos rightPad() y leftPad() de la libreria Apache Commons que usamos en este proyecto. De esta forma yo podia simplemente escribir los elementos que irian en la tabla sin preocuparme de usar los tags.
Desafortunadamente el codigo para etsa version se borro y no tome screencaptures de los resultados donde salian mal alineados los titulos de las “tabla” con lo elemento abajo. He aqui la mejor evidencia:
Me disculpo por la imagen. Como salian desalineados los elementos, decidi usar simplemente las tags de tabla (<table>) para que la vida sea mas facil.
Por ejemplo el sgte. es un snippet de codigo que muestra como se escribe el archivo htm, sacado del metodo ordenarAlfabeticamente():
Iterator<Movie> iter2 = tmp.iterator(); try{ FileWriter fw = new FileWriter(Archivo); BufferedWriter bw = new BufferedWriter(fw); bw.write("<!DOCTYPE html>"); bw.newLine(); bw.write("<html> <head> <title>Peliculas Ordenadas Alfabeticamente </title> </head>"); bw.newLine(); bw.write("<style> h1{ text-align:center} th{text-align:center} "); bw.newLine(); bw.write("</style>"); bw.newLine(); bw.write("<body>"); bw.newLine(); bw.write("<h1> Peliculas Ordenadas Alfabeticamente </h1> "); bw.newLine(); bw.write("<table style=\"width:100%\" >"); bw.write("<tr style=\"background-color:lightgrey;\">\n<th width=\"45%\">Titulo</th>\n<th width=\"10%\">Año</th>\n<th width=\"15%\">Rating Promedio</th>\n<th width=\"15%\">Newest Rating</th>\n<th width=\"15%\">Oldest Rating</th>\n</tr>"); bw.newLine(); while(iter2.hasNext()){ temporal = (Movie) iter2.next();
bw.write("<tr>\n"); bw.write("<td>" + temporal.getTitulo() + "</td> \n"); bw.write("<td style= \"text-align: center\">" + temporal.getAño() + "</td> \n"); bw.write("<td style= \"text-align: center\">" + temporal.getRatingPromedio() + "</td> \n"); bw.write("<td style= \"text-align: center\">" + temporal.newestRating + "</td> \n"); bw.write("<td style= \"text-align: center\">" + temporal.oldestRating + "</td> \n"); bw.write("</tr>\n"); } bw.write("</table>"); bw.newLine(); bw.write("</body> </html>");
bw.close();
Primero se obtiene la lista de resutados y se los meten en un iterador, se abre un archivo nuevo con el nombre apropidado (en la funcionalidad de buscar peliculas por coincidencia de palabras, se usa el String que ingresa el usuario para construir el nombre del archivo, “CoincidenciaCon” + String) . De ahi se van escribiendo los tags de las partes principales de la pagina web y se ingresan los datos de cada pelicula en tablas.
He aqui una imagen del archivo html creado por el metodo buscarPelicula().
A pesar de que el “diseño” (si es que se lo puede llamar asi) es muy basico, cumple con los requerimientos del proyecto.
Un diseño en el que estba trabajando, pero no complete usaba los colores del GUI que presentamos:
Sin embargo no lo pude arreglar para q se vea esteticamente bonito, asi que ahi se quedo. Este diseño debio haber sido establecido desde el principio, para asi poder terminarlo, en vez de hacer uno “temporal” (el que se crea por el programa) y uno definitivo (que no se termino).
Estructura de Datos - Proyecto 1
Para el primer proecto de la clase Estructura de Datos, se nos pidio crear una aplicacion que lea un conjunto de 17700 archivos de texto que contenian informacion las calificaciones dadas por usuarios de Netflix a 17700 peliculas. Cada archivo representa una pelicula, y cada linea tiene el numero de identificacion del ususario, el rating que le dio (que puede ser de 1 a 5 estrellas) y la fecha en la cual fue dado este rating. Ademas de esto se nos proporciono otro archivo que vinculaba el numero de cada uno de los 17700 archivos de texto con un pelicula, dandonos el titulo de esta, y la fecha en que salio.
El proposito de la aplicacion es poder buscar ciertas peliculas en de acuerdo a ciertos parametros que se nos piden. Por ejemplo, unos de los funcionamientos del programa es poder mostrar las peliculas en orden descendente por su calificacion promedio. Un ejemplo de otra funcionalidad es de mostrar todas las calificaiones que dio un Cliente (Sin embargo esta funcionalidad fue eliminada de los requisitoos del proyecto ya que muchos estudiantes tenian problemas con el).
Al empezar, mi compañero y yo ideamos tres TDAs necesarios para el funcionamiento del programa:
Una Clase llamada Movie, que tiene como atributos : año (short), idPelicula (short tambien, q nos dice cual de los 17700 archivos tienes las califcaciones asociadas a esta pelicula), un titulo (String) y ratingPromedio (double).
Una clase llamada Calificaciones que tiene como atributos: movieID (short), rating (short) y fecha (String).
Una Clase llamada Cliente que tiene como atributos: clienteId (int) y una lista de Calificaciones.
Nuestro plan era q al iniciar el programas se cargue una lista que contenga todos los 480189(!) clientes, y cada uno de estos a su vez obtenga una lista de las Calificaciones que dieron. Para esto, creamos metodo estatico de la clase programa llamado cargarClientes(String directorio).El parametro es la direccion de la carpeta donde estaban los 17700 archivos de Calificaciones ( en mi caso ese String seria C:\\Users\\Jorge\\Documents\\download\\training_set”). Con este metodo recorriamos cada uno de los archivos de calificaciones, por cada linea creabamos una Calificacion nueva con la informacion pertinente y la agregabamos al Cliente que le pertenecia.
public static ArrayList<Cliente> cargarClientes(String directorio){
ArrayList<Cliente> clientes = new ArrayList<>(480189); FileReader fr; BufferedReader br; String linea; int idCliente; String[] data;
for(short i =1; i<=50; i++){
try{
fr = new FileReader(formatearArchivo(i,directorio)); //fr = new FileReader(directorio); br = new BufferedReader(fr); //Se lee la primera linea para poder llegar a las calificaciones linea = br.readLine();
while( (linea = br.readLine()) != null ){
data = linea.split(","); idCliente = Integer.parseInt(data[0]);
Cliente tmp; Iterator iter = clientes.iterator();
while(iter.hasNext()){ tmp = (Cliente) iter.next(); if(tmp.clienteID == idCliente){ tmp.calificaciones.add(new Calificacion(i, Short.parseShort(data[1]), data[2])); break; } }
if(!iter.hasNext()){ //Si la lista de Clientes no tiene al Cliente leido en el archivo, se crea uno nuevo temporal y se le agrega la Calificacion Cliente nuevoCliente = new Cliente(idCliente); nuevoCliente.calificaciones.add(new Calificacion(i, Short.parseShort(data[1]), data[2])); //Se agrega el nuevo Cliente a las lista de Clientes clientes.add(nuevoCliente); }
//
} } catch(FileNotFoundException ex){ System.out.println("El archivo no existe"); } catch(IOException ex){ System.out.println("Error al leer archivo."); }
}
return clientes; }
El problema es que por cada linea de cada archivo, al crear una nueva instancia del TDA Calificacion, el programa tenia que chequear el ID del Cliente que dio esacalificacion (rating) y chequear si es q ya habia una instancia de ese Cliente en el ArrayList clientes para saber a quien agregarlo, o crear un Cliente nuevo en el caso de que el Cliente no exista. Esto de aqui tomaba mucho tiempo, tanto asi que que para cargar solo 50 rchivos se tardo alrederor de 7 minutos!
En la imagen anterior se puede ver claramente el problema (si es que por alguna razon el prblema de nuestro mal diseño no esta claro). el numero 169508 que esta impreso por la consola es el tamaño de la lista de Clientes al terminar de cargar los 50 primeros archivos. Esa es la lista que el programa tiene que recorrer por cada linea de que lee de los proc¡ximos archivos. Osea que si el rimer cliente del archivo “mv_0000051.txt” es un cliente nuevo, el programa tendra que comparar su ID con el ID de cada uno de los clinetes de la lista!
Fue aqui que nos dimos cuenta que etsa solucion no era para nada optima y la descartamos.
Tratamos de crear un nuevo plan. Nos dimos cuenta que la mayoria de los enunciados, esto es las funcionalidades del proyecto) tenian que ver con listar peliculas de acuerdo a la informacion de ellas (listarlas alfabeticamente, listar descendientemente por rating, por fecha, etc) y solo una tenia que ver con los Clientes en si. Asi que decidimos en vez cambiar el TDA Calificaciones para que tenga como uno de sus atributos a clienetID ( el cliente q creo esa clasificaion) en vez de movieID y que sean los objetos peliculas que tengas lista de Calificaciones. De esta forma no hay que chequear por q haya duplicados, ya que cada Cliente solo puede dar un rating por pelicula.
Esto igual trajo otros problemas.
ADDENDUM: Me olvide de escribir sobre la forma de abrir los archivos de peliculas. Para hacer esto escribi la funcion FormatearArchivo():
public static String formatearArchivo(int t, String directorio){
String number; String fileName = directorio + "\\mv_"; number = Integer.toString(t); for(int i=0; i < (7- number.length()) ; i++) fileName = fileName + "0";
fileName = fileName + number + ".txt"; return fileName; }
La cual devuelve un String con el directorio donde esta ubicado unno de los archivos. El parametro int t es un numero entero entre 1 y 17700. La funcion encargada de cargar los archivos, usaria esta funcion para pasarla como parametro a FileReader. Esto fue reemplazado por una simple funcion For Each de un Objeto File que busca todos los archivos que estan dentro de una carpeta en un directorio dado:
...
File dir = new File(directorio); String dateAsInt;
for (File file : dir.listFiles()){ try{ cont = 0; acumuladorRating = 0; fr = new FileReader(file); br = new BufferedReader(fr); br.readLine();
...
Esta es parte del codigo pertinente del metodo cargarPeliculas(). Mucho mas facil de leer e implementar que la funcion formatearArchivo().
Deber Numero Tres de Estructuras de Datos - Paralelo 3
Text Pending

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Deber numero Dos de Estructuras de Datos - Paralelo 3
En este post voy a explicar como hice el deber numero dos de la clase de Estructuras de Datos del Ing. Jorge Rodriguez.
Para empezar tenemos que completar el sgte. codigo para que corra:
public class Programa {
public static void main(String[] args){ LinkedList<Coordenada> conjunto1 = new LinkedList<>(); LinkedList<Coordenada> conjunto2 = new LinkedList<>(); LinkedList<Coordenada> union, interseccion, resta; Programa.cargarC1(conjunto1); Programa.cargarC2(conjunto2); union = Conjunto.union(conjunto1,conjunto2); interseccion = Conjunto.interseccion(conjunto1,conjunto2); resta = Conjunto.diferencia(conjunto1,conjunto2); Conjunto.imprimir(union); Conjunto.imprimir(interseccion); Conjunto.imprimir(resta); } private static void cargarC1(LinkedList<Coordenada> conjunto){ conjunto.add(new Coordenada(10, 10, "Ciudad 1")); conjunto.add(new Coordenada(20, 20, "Ciudad 2")); conjunto.add(new Coordenada(30, 30, "Ciudad 3")); conjunto.add(new Coordenada(40, 40, "Ciudad 4")); } private static void cargarC2(LinkedList<Coordenada> conjunto){ conjunto.add(new Coordenada(50, 50, "Ciudad 5")); conjunto.add(new Coordenada(20, 20, "Ciudad 2")); conjunto.add(new Coordenada(60, 60, "Ciudad 6")); conjunto.add(new Coordenada(40, 40, "Ciudad 4")); } }
Este programa representauna serie de conjuntos con unas listas enlazadas. Los contenidos de estas listas son cargados por los metodos cargarC1 y cargarC2.
Para que este programa pueda correr, necesitamos algunas cosas:
Una Clase llamada Conjunto
Cuatro metodos estaticos dentro de esa clase: union, interseccion , diferencia e imprimir.
Dos metodos estaticos en la clase Programa: cargar ( la cual lee un archivo de texto y usa la informacion dentro para crear una LinkedList) y un metodo guardar ( el cual guarda los contenidos de la LinkedList en un archivo de texto).
Primero me concentre en crear los metodos de la clase conjunto ya que son los mas importantes para el funcionamiento del programa.
El primer metodo que cree fue el metodo union:
public static LinkedList<Coordenada> union(LinkedList conjunto1, LinkedList conjunto2){
LinkedList<Coordenada> resultado = new LinkedList<>(); LinkedList<Coordenada> conjuntoGrande; LinkedList<Coordenada> conjuntoPequeño;
if( conjunto1.size() < conjunto2.size() ){ conjuntoGrande = conjunto2; conjuntoPequeño = conjunto1; } else{ conjuntoGrande = conjunto1; conjuntoPequeño = conjunto2; }
resultado.addAll(conjuntoGrande);
Iterator iter = conjuntoPequeño.iterator();
Coordenada tmp; Coordenada tmp2;
while( iter.hasNext() ){ tmp = (Coordenada)iter.next();
for(int i =0; i < resultado.size(); i++){ tmp2 = (Coordenada) resultado.get(i); if(tmp2.equals(tmp)){ break; } else{ resultado.addLast(tmp); } }
}
}
En este metodo, obtenemos dos listas enlazadas que entran por parametro. Usamos un condicional para escoger la mas lista con mas contenidos que se guarda en la variable conjuntoGrande, mientras que la mas pequeña se guarda en la variable conjuntoPequeño. Despues declaramos una variable de tipo LinkedList y le agregamos todos los contenidos de conjuntoGrande. A continuacion use un iterador para recorrer todos los contenidos del conjunto pequeño y copararlos con los contenidos del conjunto resultado. Si el contenido del conjuntoPequeño era igual (aqui se uso el metodo equal() ) a uno de los elementos de resultado, no se lo agregaba. Sin embargo esto creo el primer error del programa, ya que la forma en que lo implemente me dio la sgte. salida:
El primer grupo de Coordenadas deberia solo tener 6 elementos que correspondan a las ciudades 1, 2, 3, 4, 5 y 6. Sin embargo se puede ver que hay 21 Coordenadas. Deje el arreglo de este metodo para despues.
Me enfoque mas en el segundo metodo que es la interseccion:
public static LinkedList<Coordenada> interseccion(LinkedList conjunto1, LinkedList conjunto2){
LinkedList<Coordenada> resultado = new LinkedList<>();
Iterator iter = conjunto1.iterator();
Coordenada tmp; Coordenada tmp2;
while( iter.hasNext() ){ tmp = (Coordenada)iter.next();
for(int i =0; i < conjunto2.size(); i++){ tmp2 = (Coordenada) conjunto2.get(i); if(tmp2.equals(tmp)){ resultado.addLast(tmp); break; }
}
}
return resultado; }
Aqui se recorre la primera lista con un iterador y se usa un lazo para comparar cada elemento de esta lista con la de la segunda. si se esncuentra un elemento de la segunda lista que es igual al elemento que se esta viendo actualmente en el iterador, se agrega ese elemento a la lista resultado y se hace un break en el lazo, lo cual noslleva al sgte. elemento del iterador. al final se retorna la lista resultado.
El tercer metodo es diferencia:
public static LinkedList<Coordenada> diferencia(LinkedList conjunto1, LinkedList conjunto2){
LinkedList<Coordenada> interseccion = interseccion(conjunto1, conjunto2); LinkedList<Coordenada> resultado = new LinkedList<>();
resultado.addAll(conjunto1);
Iterator iter = interseccion.iterator();
Coordenada tmp;
while(iter.hasNext()){
tmp = (Coordenada) iter.next();
for(int i = 0; i<resultado.size(); i++){ if( tmp.equals(resultado.get(i)) ){ resultado.remove(i); }
}
}
return resultado;
}
Aqui se crea una lista llamada interseccion a la cual se le asigna la interseccion de las dos listas que entran por parametro y una lista llamada resultado a la cual se le agrega los elementos de la orimera lista por parametro. Despues se usa un iterador en la lista interseccion y un lazo en la lista resultado con la cual se chequea igualdad de elementos. Todo elemnto que se encuentra en las dos listas se lo remueve de la lista resultado y se retorna esa lista.
Aqui regrese al primer metodo donde simplemente lo reescribi en terminos de intersecciones y diferencia. Basicamente el metodo diferencia se deshace de los elementos repetidos, y el metodo interseccion se encarga de guardar una copia de cada elemento repetido. Asi que para la union simplement cree cuatro listas (las dos primeras son para asignar las listas de parametro a listas locales):
LinkedList<Coordenada> con1 = conjunto1; LinkedList<Coordenada> con2 = conjunto2; LinkedList<Coordenada> resta1Menos2 = diferencia(con1, con2); LinkedList<Coordenada> resta2Menos1 = diferencia(con2, con1); LinkedList<Coordenada> resultado = new LinkedList<> LinkedList<Coordenada> interseccion = interseccion(conjunto1,conjunto2);
BAsicamente la union(a,b) va a tener los mismos elementos de una lista que tenga los elementos de la diferencia(a,b), diferencia(b,a) e interseccion(a,b). Asi que solo agregue los elementos de esas operaciones a la lista resultado que se la retorna al final. Esto me dio el sgte output:
El cual es correcto.
Para el metodo de imprimir solo use un FOR EACH para imprimir por pantalla cada Coordenada.
Para el metodo cargar en la clase Programa simplemente reuse el mismo metodo que esta en la clase Coordenada que usamos en clase.
If it ain´t broke, don´t fix it.
En el sgte. metodo, guardar, use un FileWriter y un BufferedWriter para escoger la representacion de String de las coordenadas y escribirlas en un archivo.
private static void guardar(LinkedList<Coordenada> conjunto, String archivo){
LinkedList<Coordenada> lista = conjunto;
FileWriter fw; BufferedWriter bw; Iterator iter = lista.iterator(); String linea;
try{ fw = new FileWriter(archivo); bw = new BufferedWriter(fw);
while(iter.hasNext()){ linea = iter.next().toString(); bw.write(linea); bw.newLine();
} bw.close();
}catch(IOException ex){ System.out.println("Error de escritura!! >:0("); }
}
Use un iterador para recorrer la lista que se entrega por parametro, guerde su representacion en String en una variable llamada linea:
while(iter.hasNext()){ linea = iter.next().toString(); bw.write(linea); bw.newLine();
Y al final se cierra el archivo con el comando bw.close();.
En el metodo main de Programa, use el metodo cargar para darle los valores a conjunto1 y conjunto2.