Trabajo de Java, problema con 2 LinkedList en 1 TreeMap

penetration

Buenas, estoy realizando un trabajo de java sencillito Con Jframe y Jdialogs, el cual es una biblioteca.
En ella creo usuarios y libros, los muestro, los borro,etc.
Tengo una el main VentanaPrincipal
Biblioteca, donde tengo el Treemap, donde la key es el usuario que esta en otra clase, y el valor los libros, que esta en otra.

public class Biblioteca {

private TreeMap<Usuario,Libro> biblio;


public Biblioteca()
{
	 biblio = new TreeMap<Usuario,Libro>();

}

Todo lo demas son Jdialogs(donde creo tanto el user como los libros, donde los borro, etc. Menos los 2 listar que los tengo en el JmenuItem y de ahi los muestro directamente.

al intentar de añadirlo me da un error en el valor y no se que hacer.

	 public void añadeAlquiler(Usuario usuario)
	 {
		 this.biblio.put(usuario, new Libro());
	 }

En el new Libro me dice que nanai. Y no se como continuar ni que probar, ya que he probado diversas cosas y nada.

elkaoD

¿Qué error da exactamente?

1 respuesta
Lecherito

Pones -3 de código, ni siquiera el constructor de Libro, no pones el error, no pones ningún ejemplo...

Puede tener el usuario más de un libro?

1 respuesta
penetration

#3 Como poner codigo, puedo subiros si quereis el main con sus dialogos y clases.
Si, puede tener varios libros.
Mañana a las 9 aprox pongo las clases

#2 Error, bueno, el eclipse me salta diciendo que el new libro no puedo ponerlo asi

	 {
		 this.biblio.put(usuario, new Libro());
	 }

y me da varias opciones, como el de crear en la Clase Libro un constructor vacio de libro, o poner en esa misma linea new libro(null));

Ambas inutiles por desgracia.

1 respuesta
Lecherito

#4 Un treemap no permite claves duplicadas, por lo que un usuario solo podría tener un libro a la vez (si no recuerdo mal)

1 respuesta
penetration

#5 Cierto.

Aqui estan los archivos. Por si quieres mirarlos.
Aun asi pongo aqui el codigo de las 3 clases (biblioteca, usuario y libro).

Biblioteca

import java.util.TreeMap;


public class Biblioteca {

private TreeMap<Usuario,Libro> biblio;


public Biblioteca()
{
	 biblio = new TreeMap<Usuario,Libro>();

}
 public void añadeLibro(Usuario usuario, Libro libro)
 {
  this.biblio.get(usuario).add(libro);
 }

 public TreeMap<Usuario,Libro> getBiblio()
 {
	 return biblio;
 }
 
 public boolean contieneCaseta(Usuario usuario)
 {
	 return biblio.containsKey(usuario);
 }
 
 public void añadeAlquiler(Usuario usuario)
 {
	 this.biblio.remove(usuario);           // no deberia ser necesario
	 this.biblio.put(usuario, new Libro());
 }
 
 public void eliminaAlquiler(Usuario usuario)
 {
	 this.biblio.remove(usuario);        
 }
 
 public String toString()
 {
	 String res="";
	 for(Usuario usuario:this.biblio.keySet())
		 res += usuario.toString();
     return res;
 }
 
}

Usuario

public class Usuario //implements Comparable<Usuario>
{
	
private String nomyape;
private int edad;
private boolean sexo;

public Usuario(String nomyape)
{
	this.nomyape=nomyape;
	
}
public Usuario(String nomyape,int edad,boolean sexo)
{
	this.nomyape=nomyape;
	this.edad=edad;
	this.sexo=sexo;
	
}

public boolean getSexo() {
	return sexo;
}


public int getEdad() {
	return edad;
}


public String getNomyape() {
	return nomyape;
}
@Override
/*	public int compareTo(Usuario arg0) {
		// TODO Auto-generated method stub
		return 0;
	}*/
	public boolean equals(Object usu)
	{
		boolean res=false;
		if(this.nomyape.equals(((Usuario)usu).getNomyape()) &&
			this.edad==((Usuario)usu).getEdad())
		  res=true;
		  
return res; } public String toString() { return nomyape; } public String cadenaUsu() { String cad; cad="Nombre y Apellidos: "+nomyape+"\n"; cad+="Edad: "+edad+"\n"; if(sexo==true) cad+="Sexo: Masculino"+"\n\n"; else cad+="Sexo: Femenino"+"\n\n"; return cad; } }

Libro

import java.util.LinkedList;


public class Libro// implements Comparable<Libro>
{
	
private String nombre;
private int paginas;
private String editorial;
private int isbn;
private String genero;
private LinkedList<Libro> listaLibros;

public Libro(String nombre)
{
	this.nombre=nombre;
}

public Libro(String nombre, int paginas, String editorial, int isbn, String genero)
{
	this.nombre=nombre;
	this.paginas=paginas;
	this.editorial=editorial;
	this.isbn=isbn;
	this.genero=genero;
	
}


public Libro() {
}

public String getNombre()
{
	return nombre;
}

public int getPaginas()
{
	return paginas;
}

public String getEditorial(){
	return editorial;
}

public int getIsbn()
{
	return isbn;
}

public String getGenero()
{
	return genero;
}

/*public boolean equals(Object lib)
{
	boolean res=false;
	if(this.nombre.equals(((Libro)lib).getNombre()) &&
		this.isbn==((Libro)lib).getIsbn())
	  res=true;
	  
	  return res;
}*/

  public String toString()
  {
	  String res="";
	  
	  for(Libro l:listaLibros)
		  res += l+"\n";
		  
	  return res;	  
  }


public String cadenaLib()
{
	String cad;
	cad="Nombre del libro: "+nombre+"\n";
	cad+="Paginas: "+paginas+"\n";
	cad+="Editorial: "+editorial+"\n";
	cad+="ISBN: "+isbn+"\n";
	cad+="Genero: "+genero+"\n\n";
	
	return cad;
}
public boolean equals(Object libro)
 {
	 return(this.nombre == ((Libro)libro).getNombre());
 }

public void add(Libro libro) {
	// TODO Auto-generated method stub
	
}





}

Gracias!

Lecherito

http://sscce.org/

  • Omite el código que no tenga nada que ver con el problema.

PD: Yo pondría siempre super(); en los constructores, aunque no pases ningún parámetro.

1
Starshow

A bote pronto por lo que me acuerdo de java cuando hice la carrera es que el Treemap es de la colección Sorted map que ordenaba por <K,V>, con lo que me da que el usar el constructor new Libro() dentro de el valor te da el error.

Intenta capturar antes los datos del libro y se los pasas una vez creados al Treemap a ver si se te soluciona y un consejo, igual el treemap no te viene del todo bien ahí ya que como comentan arriba no aceptaba claves duplicadas, por lo que si quieres usarlo tendrías que meter tambíen apellidos o usar el dni como clave, tu mismo!

Un saludo

elkaoD
public void añadeAlquiler(Usuario usuario) {
  this.biblio.put(usuario, new Libro());
}

...no debería ser más bien...

public void añadeAlquiler(Usuario usuario, Libro libro) {
  this.biblio.put(usuario, libro);
}

?

El constructor de Libro necesita un String para el nombre por lo que veo. En el siguiente ejemplo veo que has añadido un constructor vacío pero no le veo mucho sentido.

Usuarios habituales

  • elkaoD
  • Starshow
  • Lecherito
  • penetration