Autor Tema: Java ejercicio implementar una caché de objetos de tipo Mensaje con límite  (Leído 6182 veces)

manuelfer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
El enunciado es el siguiente:

TALLER DE PROGRAMACIÓN I

Ejercicio 1

Necesitamos implementar una caché de objetos de tipo Mensaje en un servidor. Los mensajes tienen un id, un texto (el mensaje propiamente dicho), una prioridad asociada (la cual debe ser implementada utilizando enums), una fecha y hora de recepción.

El servidor de caché tiene un límite de la cantidad de objetos que puede guardar, una vez alcanzado ese límite, y frente a la llegada de otro mensaje, el mismo procede a descartar el de menor prioridad y entre los de menor prioridad el más viejo de todos.

Si la condición anterior se repitiera 3 veces el servidor debe lanzar una excepción verificada informando del problema.

El usuario de la caché puede realizar dos operaciones:

1) Pedir todos los objetos de una determinada prioridad

2) Pedir una Set de todos los elementos ordenados por prioridad


Ejercicio 2


Modifique el ejercicio anterior para que la caché pueda funcionar con otros elementos además del Mensaje y que sea validado en tiempo de compilación.



Les muestro lo que hice, y luego le digo en que parte me quede.

Código: [Seleccionar]
public class Mensaje {

private String id;
private Prioridad prio;
private String fecha;
private String hora;

public Mensaje (String id, Prioridad prio, String fecha, String hora) {

this.id = id;
this.prio = prio;
this.fecha = fecha;
this.hora = hora;

}

public String getId () {
return id;
}

public Prioridad getPrio () {
return prio;
}

public String getFecha () {
return fecha;
}

public String getHora () {
return hora;
}


}


Código: [Seleccionar]
import java.util.ArrayList;
public class Menu {
ArrayList <Mensaje> lista = new ArrayList <Mensaje> ();

public Menu () {

}

public void agregarMensajes (Mensaje m) {
lista.add (m);
}

public void cantidadMensajes (){
System.out.println(lista.size ());
}

public void borrarMensajes (){
int limite, cant;
cant = lista.size ();
limite = 3;
if (cant == limite){
lista.remove (Prioridad.BAJA);
}
}

 }


Código: [Seleccionar]
public enum Prioridad {
BAJA, MEDIA, ALTA;

}


Código: [Seleccionar]
public class Test {

public static void main(String[] args) {

Menu tester = new Menu ();
Mensaje m1 = new Mensaje ("18-8fg2-87hg",Prioridad.BAJA,"14/8/15","14:32 AM.");
Mensaje m2 = new Mensaje ("92-555j7-32g",Prioridad.ALTA,"4/9/15","11:25 AM.");
Mensaje m3 = new Mensaje ("66-785Y-32g",Prioridad.MEDIA,"6/3/15","22:15 AM.");
Mensaje m4 = new Mensaje ("92-555j7-32g",Prioridad.ALTA,"4/9/15","11:25 AM.");

tester.agregarMensajes (m1);
tester.agregarMensajes (m2);
tester.agregarMensajes (m3);
tester.agregarMensajes (m4);

tester.cantidadMensajes ();

tester.borrarMensajes();

tester.cantidadMensajes();
}
}

Yo hice hasta ahi, me quede en como borrar el mensaje que tenga la PRIORIDAD.BAJA... Nose como hacer para que el mensaje tenga la prioridad baja, al excederse del limite de 3 mensajes se elimine. Me podrian ayudar como hacer?

« Última modificación: 26 de Mayo 2015, 16:56 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:[Ayuda] Ejercicio Java. Examen
« Respuesta #1 en: 25 de Mayo 2015, 20:31 »
Hola Ignacio! Para pegar código hazlo como se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0 de esa forma se facilita el formato y que pueda copiarse y pegarse para compilarlo.

Para aclarar conceptos te recomiendo seguir este curso: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

La clase que  tú has llamado Menu parece más lógico llamarla CacheMensajes o ListaMensajes

La comprobación de que no hayas excedido el límite de mensajes admisible en la caché debes hacerla aquí:

public void agregarMensajes (Mensaje m) {
   if (lista.size()>3) {
      System.out.println ("Hay más mensajes de los permitidos y se va a borrar uno de ellos para poder añadir otro");
      // Aquí el código
      int indiceAEliminar = obtenerIndiceMensajeMenorPrioridad();
      }   

lista.add (m);
}


El método int obtenerIndiceMensajeMenorPrioridad() será un método que te devuelva el índice del mensaje a eliminar. Para saber el mensaje a eliminar puedes recorrer todos los mensajes eligiendo como mensaje a eliminar el primero, y seguidamente si el siguiente mensaje tiene menor prioridad, elegirlo como mensaje a eliminar (de esta forma completas el recorrido).

Para poder elegir el más antiguo es recomendable que cambies esta definición:

   private String fecha;
   private String hora;

En lugar de usar String usa clases del api de java para manejo de fechas y horas. O si prefieres simplificar usa:

int dia, mes, anno;
int hora, minuto;

La cuestión es que necesitas poder ordenar o comparar fechas y horas y para hacerlo un String no es cómodo.

Salu2

manuelfer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:[Ayuda] Ejercicio Java. Examen
« Respuesta #2 en: 25 de Mayo 2015, 20:51 »
Hola, muchisimas gracias por tu ayuda.. Lo pude eliminar el mensaje de prioridad baja al llegar al limite en el dia de ayer antes de leer el foro.

Lo hice de esta forma:

ListaMensajes:

Código: [Seleccionar]
import java.util.ArrayList;

public class ListaMensajes{
ArrayList<Mensaje> lista = new ArrayList<Mensaje>();

public ListaMensajes (){

}

public void agregarMensajes(Mensaje mensaje) {
lista.add(mensaje);

}

public void cantidadMensajes() {
System.out.println(lista.size());

}

public void borrarMensaje() {

for (int i = 0; i < lista.size(); i++) {
if (lista.get(i).getPrio() == Prioridad.BAJA) {
lista.remove(lista.get(i));

}
}
}


}

Test:

Código: [Seleccionar]
public class Test {

public static void main(String[] args) {

ListaMensajes tester = new ListaMensajes();
Mensaje m1 = new Mensaje("18-8fg2-87hg", Prioridad.BAJA, "14/8/15",
"14:32 AM.");
Mensaje m2 = new Mensaje("92-555j7-32g", Prioridad.ALTA, "4/9/15",
"11:25 AM.");
Mensaje m3 = new Mensaje("66-785Y-32g", Prioridad.MEDIA, "6/3/15",
"22:15 AM.");
Mensaje m4 = new Mensaje("92-555j7-32g", Prioridad.ALTA, "4/9/15",
"11:25 AM.");

tester.agregarMensajes(m1);
tester.agregarMensajes(m2);
tester.agregarMensajes(m3);
tester.agregarMensajes(m4);

System.out.print("Cantidad de mensajes: ");
tester.cantidadMensajes();

System.out.println(">>(FILTRO)<<");
//borrar mensaje de prioridad baja al llegar al limite
tester.borrarMensaje();

System.out.print("Cantidad de mensajes: ");
tester.cantidadMensajes();

}

}

Al compilar.....:

Citar
Cantidad de mensajes: 4
>>(FILTRO)<<
Cantidad de mensajes: 3

Mi duda es.. no le puedo encontrar la forma para que me muestre digamos los 4 mensajes con sus respectivos atributos (id, prioridad, fecha, etc) antes de pasarle el filtro, y cuando le pase el filtro me muestre los 3 mensajes que quedaron (ya que al pasarle el filtro se elimino un mensaje de prioridad baja).. Como tendria que hacer?
« Última modificación: 25 de Mayo 2015, 20:53 por ignaciolopez »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:[Ayuda] Ejercicio Java. Examen
« Respuesta #3 en: 25 de Mayo 2015, 23:47 »
Hola simplemente recorrer la colección con un bucle y mostrar los atributos. Si sigues el curso que te he indicado serás capaz de resolverlo sin problemas. En este ejercicio del curso puedes ver un ejemplo de cómo hacerlo - > https://www.aprenderaprogramar.com/foros/index.php?topic=2514.0

Salu2

manuelfer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:[Ayuda] Ejercicio Java. Examen
« Respuesta #4 en: 26 de Mayo 2015, 00:01 »
Si si, lo vi, hice este bucle

Código: [Seleccionar]
  public void listaMensajes(){
        for (int i = 0; i < lista.size(); i++) {
            System.out.println("Mensaje "+(i+1)+" : "+lista.get(i));
        }
    }

pero me compila esto:

Citar
Mensaje 1 : Mensaje@659e0bfd
Mensaje 2 : Mensaje@2a139a55
Mensaje 3 : Mensaje@15db9742

yo quisiera que me compile asi:

Citar
Mensaje 1 : Id: 18-8fg2-87hg // Prioridad: BAJA // Fecha: 14.8.15 // Hora: 14.32.54
Mensaje 2 : Id: 66-785Y-32g // Prioridad: MEDIA // Fecha: 6.3.15 // Hora: 19.15.55
Mensaje 3 : Id: 92-555j7-32g // Prioridad: ALTA // Fecha: 4.9.15 // Hora: 11.25.65
Mensaje 4 : Id: 92-555j7-32g // Prioridad: BAJA // Fecha: 5.8.15 // Hora: 8.55.95

manuelfer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:[Ayuda] Ejercicio Java. Examen
« Respuesta #5 en: 26 de Mayo 2015, 03:10 »
Hola simplemente recorrer la colección con un bucle y mostrar los atributos. Si sigues el curso que te he indicado serás capaz de resolverlo sin problemas. En este ejercicio del curso puedes ver un ejemplo de cómo hacerlo - > https://www.aprenderaprogramar.com/foros/index.php?topic=2514.0

Salu2

Ya pude mostrar los mensajes.. Me funciono !! Ahora.. como hago para eliminar el mensaje mas viejo ? en el link que me pasaste no esta como hacer!!

Desde ya muchas gracias

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:[Ayuda] Ejercicio Java. Examen
« Respuesta #6 en: 26 de Mayo 2015, 10:45 »
Hola yo lo que entiendo es que la eliminación de mensaje más viejo debería hacerse automáticamente si tratas de añadir más mensajes estando lleno el límite disponible como te indicaba en https://www.aprenderaprogramar.com/foros/index.php?topic=2632.msg12323#msg12323

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".