Hola, queria saber como modificar el valor de la variable del objeto, estoy todavia con el buzon, al metodo añadir hay que pasarle el objeto c y antes lo he intentado poner para que se pueda introducir por teclado el contenido del mesaje, gracias.

miguelsat escribió

Hola, queria saber como modificar el valor de la variable del objeto, estoy todavia con el buzon, al metodo añadir hay que pasarle el objeto c y antes lo he intentado poner para que se pueda introducir por teclado el contenido del mesaje, gracias.

No se si es que estoy dormido o no te has explicado bien, pero no me he enterado de casi nada.

No se en que lenguaje estás trabajando, ni se que dices de un buzón, ni de un metodo de añadir que tienes que pasarle no se qué objeto...

Se agradecería un poco más de información, y si se pone el fragmento de código o lo que consideres necesario para acompañar a la explicación, mejor.

Saludos.

no me explicao nada bien, era para introducir por teclado el contenido del mensaje para pasarlo al objeto a introducir en el array, eso ya lo e averiguado, aora estoy con java, concretamente con el ejercicio de los buzones, el enunciado es este, mas o menos lo tengo echo, funciona casi todo pero a la hora de comprobar si el array esta lleno y mostrar un mensaje, me sigue pidiendo los datos y me da error que me e salido del array, os dejo el enunciao y mi codigo.

Define la clase Buzon para gestionar un buzón de correos electrónicos ordenados según el orden de llegada. Para representar el buzón se usa un array de correos electrónicos; estos, a su vez, son objetos de la clase Correo y tienen como atributos un String, con el contenido del correo, y un indicativo para saber si han sido leídos o no. Define la clase Correo con los métodos que creas convenientes, sabiendo que la clase Buzon debe incluir los siguientes métodos públicos:

int numeroDeCorreos(), que calcula cuántos correos hay en el buzón
void añade(Correo c), que añade c al buzon
boolean porLeer(), que determina si quedan correos por leer
String muestraPrimerNoLeido(), que muestra el primer correo no leído
String muestra(int k), que muestra el correo k-ésimo, se haya leído o no
void elimina(int k), que elimina el correo k-ésimo.
Debes crear una clase ejecutable que pruebe la clase Buzon, creando varios objetos y comprobando de manera explícita que funciona de forma correcta en todas las posibles situaciones.

CLASE MAIN

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {

        menuaplicacion();
    

}

           public static void menuaplicacion() throws IOException{
           
               Buzon buzon = new Buzon();
               
               
               String contenido="", cont=""; 
               int opcion, numcorreo;
               
               BufferedReader Entrada = new BufferedReader(new InputStreamReader(System.in));
               
               do{
               
                  opcion=Integer.parseInt(JOptionPane.showInputDialog(  "1-Numero total de correos" +
                                                                        "\n2-Añadir correo" + 
                                                                        "\n3-Mostrar si queda algun correo por leer " + 
                                                                        "\n4-Mostrar el primer correo no leido " +
                                                                        "\n5-Mostrar el correo deseado "+
                                                                        "\n6-Eliminar correo deseado " +
                                                                        "\n\n-Elige una opcion"));
                   
                  if(opcion==1){
                      
                      JOptionPane.showMessageDialog(null, "Numero de correos que hay en el buzon: " + buzon.numeroDeCorreos());
                      
                      
                  }
                  
                  
                  else if(opcion==2){
                      
                 
                      do{
                        
                   
                        contenido=JOptionPane.showInputDialog("Introduce contenido del mensaje: ");
                        
                        cont = JOptionPane.showInputDialog(null,"¿Continuar introduciendo correos? S/N");
                                                                            
                        Correo correo = new Correo(contenido);
                        buzon.añadeCorreo(correo);
                        
                      
                    
                   }while("s".equals(cont) || "S".equals(cont));
                    
                 
  
                  
                  
                  }else if(opcion==3){
                                          
                    JOptionPane.showMessageDialog(null, "Quedan correos por leer" + buzon.porLeer());
               
               }    
                   
                    
               else if(opcion==4){
                   
                   JOptionPane.showMessageDialog(null, buzon.muestraPrimerNoLeido());
                   
                    
                    
               }     
                    
                    
               else if(opcion==5){    
                
                    numcorreo=Integer.parseInt(JOptionPane.showInputDialog("Introduce el numero de correo a visualizar: "));
                   
                    JOptionPane.showMessageDialog(null, "el contenido del mensaje es:" + buzon.muestra(numcorreo));
      
               }

               else if(opcion==6){
                   
                   numcorreo=Integer.parseInt(JOptionPane.showInputDialog("Introduce el numero de correo a eliminar: "));
                   
                   buzon.elimina(numcorreo);
                   
                   JOptionPane.showMessageDialog(null, "Correo borrado");
                   
               }

               
               }while(opcion<7);           


       }

}

CLASE CORREO

public class Correo {


private String contenido;
private boolean leido=false;


public Correo(String contenido){
    
    this.contenido=contenido;
    this.leido=false;
    
    
}


public String getContenido(){
    
    return this.contenido;
}

public boolean getLeido(){
    
    return this.leido;
}

public void setContenido(String contenido){
    
    this.contenido=contenido;
}

public void setLeido(boolean leido){
    
    this.leido=leido;
}


}

CLASE BUZON

public class Buzon {


    Correo[] array = new Correo[1];
    private int cont;
    
    
public Buzon(){
    
    this.cont=0;
    
}


public int numeroDeCorreos(){
    
   return cont;
    
}
                        

public void añadeCorreo(Correo c){
    

    array[cont]=c;
  
    cont++;
    

}    

public boolean porLeer(){
    
    for(int i=0; i<cont; i++){
        if(array[i].getLeido()==false){
            return true;
        }
    }
    return false;
   
}


public String muestraPrimerNoLeido(){
    
    for(int i=0; i<cont; i++){
        if(array[i].getLeido()==false){
            array[i].setLeido(true);
            return array[i].getContenido();
            
        }
        
    }

    return "Todos estan leidos";

}

public String muestra (int k){
    
    array[k].setLeido(true);
    return array[k].getContenido();
    
    

}

public void elimina(int k){
    
    array[k]=null;
    cont--;
      
}

}

Principalmente el problema que veo en tu código [A falta de que digas que problema tienes xD], es que intentas añadir correos a un Array estático de 1 solo elemento, ahí solo puedes añadir 1 elemento, para solucionarlo podrías usar una implementación de un ArrayList<Correo>.

Ejemplo :

import java.util.ArrayList;


public class Buzon {

ArrayList<Correo> array = new ArrayList<Correo>();

public Buzon(){
	
}


public int numeroDeCorreos(){
	return array.size(); 
}


public void añadeCorreo(Correo c){
	array.add(c);
} 

public boolean porLeer(){
	for(Correo c: array) {
		//Si alguno de los correos NO esta leido, devuelves true
		if(!c.getLeido()) { 
			return true;
		}
	}
	return false;
}


public String muestraPrimerNoLeido(){
	for(Correo c: array) { 
		if(!c.getLeido()) { 
			c.setLeido(true);
			return c.getContenido();
		}
	}
	return "Todos estan leidos."; 
}

/*Otra forma de mustraPrimerNoLeido() 
  para que se vea que tambien se puede recorrer
  con un for normal, y no solo con un foreach. 
  */
public String muestraPrimerNoLeidoMetodo2(){
	for(int i = 0; i < numeroDeCorreos(); i++) { 
		if(!array.get(i).getLeido()) {
			return muestra(i);
		}
	}
	return "Todos estan leidos.";
}

/*El numero que recibes es la posición: 
 * DEBES TENER EN CUENTA QUE LAS POSICIONES COMIENZAN POR EL NUMERO 0
 * por lo tanto el primero correo es el 0! 
 * si lo que quieres es que al pasar 1, se extraiga el primero (vamos el 0)
 * en Correo c = array.get(k) pones -> Correo c = array.get(k-1) 
 */
public String muestra (int k){
	Correo c = array.get(k); 
	c.setLeido(true);
	return c.getContenido();
}

/* Lo mismo de antes se aplica a la 'k' aqui */
public void elimina(int k){
	array.remove(k);
}

}

no puedo utilizar eso aun, al ejecutar el programa me añade al array los objetos que le digo y los muestra bien, la cosa es que intento poner que muestre un error cuando se llene el array.

Y esto ?

Clase Buzon : 

public boolean añadeCorreo(Correo c){
	if(cont < array.length) { 
		array[cont]=c;
		cont++;
		return true;
	}
	return false;
} 


Clase main:

linea 60:
Cambiar : 
buzon.añadeCorreo(correo);

por : 

if(!buzon.añadeCorreo(correo)) { 
	JOptionPane.showMessageDialog(null, "Buzon lleno");
}

pues creo que no funciona, siempre intenta añadir en la posicion despues de la ultima, la que no existe aun que le controle que si llega al final de un mensaje y no añada mas correos, pero lo intenta y no me saje ningun mensaje, no se por que no funciona.

Mira esta asi ;
Cambios :

  • El borrar sobre un vector funciona correctamente
  • Se informa de que el buzon esta lleno.

Archivo Main :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JOptionPane;

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {

menuaplicacion();


}

public static void menuaplicacion() throws IOException{

Buzon buzon = new Buzon();


String contenido="", cont=""; 
int opcion, numcorreo;

BufferedReader Entrada = new BufferedReader(new InputStreamReader(System.in));

do{

opcion=Integer.parseInt(JOptionPane.showInputDialog( "1-Numero total de correos" +
"\n2-Añadir correo" + 
"\n3-Mostrar si queda algun correo por leer " + 
"\n4-Mostrar el primer correo no leido " +
"\n5-Mostrar el correo deseado "+
"\n6-Eliminar correo deseado " +
"\n\n-Elige una opcion"));

if(opcion==1){

JOptionPane.showMessageDialog(null, "Numero de correos que hay en el buzon: " + buzon.numeroDeCorreos());


}


else if(opcion==2){


do{
	contenido=JOptionPane.showInputDialog("Introduce contenido del mensaje: ");
	
	Correo correo = new Correo(contenido);
	if(!buzon.añadeCorreo(correo)) { 
		   JOptionPane.showMessageDialog(null, "Buzon lleno");
		   cont = "N";
	} else { 
		cont = JOptionPane.showInputDialog(null,"¿Continuar introduciendo correos? S/N");
	}
}while("s".equals(cont) || "S".equals(cont));





}else if(opcion==3){

JOptionPane.showMessageDialog(null, "Quedan correos por leer : " + buzon.porLeer());

} 


else if(opcion==4){

JOptionPane.showMessageDialog(null, buzon.muestraPrimerNoLeido());



} 


else if(opcion==5){ 

numcorreo=Integer.parseInt(JOptionPane.showInputDialog("Introduce el numero de correo a visualizar: "));

JOptionPane.showMessageDialog(null, "el contenido del mensaje es:" + buzon.muestra(numcorreo));

}

else if(opcion==6){

numcorreo=Integer.parseInt(JOptionPane.showInputDialog("Introduce el numero de correo a eliminar: "));

buzon.elimina(numcorreo);

JOptionPane.showMessageDialog(null, "Correo borrado");

}


}while(opcion<7); 


}

}

Class Buzon :

import java.util.ArrayList;
import java.util.Arrays;


public class Buzon {


Correo[] array = new Correo[3];
private int cont;

public Buzon(){
	this.cont = 0;
}


public int numeroDeCorreos(){
	return cont; 
}


public boolean añadeCorreo(Correo c){
	if(cont < array.length) { 
		this.array[cont++] = c; 
		return true; 
	}
	return false; 
} 

public boolean porLeer(){
	for(Correo c: array) {
		if(!c.getLeido()) { 
			return true;
		}
	}
	return false;
}


public String muestraPrimerNoLeido(){
	for(Correo c: array) { 
		if(!c.getLeido()) { 
			c.setLeido(true);
			return c.getContenido();
		}
	}
	return "Todos estan leidos."; 
}


public String muestra (int k){
	Correo c = array[k]; 
	c.setLeido(true);
	return c.getContenido();
}

public void elimina(int k){
	array[k] = null; 
	
	//Una vez se borra ahi que tirar para atras los otros correos
	//Por que el que se borra no tiene por que ser necesariamente el ultimo
	//y al no ser el ultimo, eso haria que cont pudiera dar una posicion erronea. 
	for(int m = k; m < array.length-1; m++) { 
		Correo tmp = array[k+1];
		array[k] = tmp; 
	}
	this.cont--;
}

}

Ese metodo es "public void añade()" no puedo ponerle que devuelva nada, por que el enunciado asi lo especifica, ya lo e conseguido arreglar, queda asi la parte del metodo menuaplicacion de la clase main:

else if(opcion==2){

          if(buzon.numeroDeCorreos()>=(buzon.getArray()).length){
              

          }else{
              
           
              do{


                contenido=JOptionPane.showInputDialog("Introduce contenido del mensaje: ");
                Correo correo = new Correo(contenido);
                buzon.añadeCorreo(correo);
                cont = JOptionPane.showInputDialog(null,"¿Continuar introduciendo correos? S/N");
         

           }while(("s".equals(cont) || "S".equals(cont)) && buzon.numeroDeCorreos()<(buzon.getArray()).length);

          }

miguelsat, te recomiendo que pongas tus códigos entre las etiquetas

[code]

[/code]

Así podrán leerse mejor.

Se agradece que aportes la solución por si a alguien le puede servir de ayuda.

Un saludo.

no sabia como era eso de code, gracias por la ayuda.