Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Evitar Duplicar datos

Estas en el tema de Evitar Duplicar datos en el foro de Java en Foros del Web. Hola buenas, pues resulta que tengo un formulario donde doy de alta Personas con un nivel de seguridad, cada "Nick" de usuario debe de ser ...
  #1 (permalink)  
Antiguo 02/06/2017, 08:49
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Evitar Duplicar datos

Hola buenas, pues resulta que tengo un formulario donde doy de alta Personas con un nivel de seguridad, cada "Nick" de usuario debe de ser único, pero resulta que el método que tengo dentro de Personal buscarNick(nick) siempre parece dar -1 y siempre me deja dar de alta el mismo usuario hice lo mismo pero con tipo boolean y sigo teniendo el mismo problema.

Dar de alta se da, ya que el 'Vector' aumenta de tamaño..

Main.java
Código Java:
Ver original
  1. public class Main {
  2.    
  3.     /*Personal*/
  4.     static Vector<Personal> personal = new Vector();
  5.    
  6.     /*Clientes*/
  7.     static Vector<Clientes> clientes = new Vector();
  8. }


Personal.java
Código Java:
Ver original
  1. package Hotel;
  2. import java.io.Serializable;
  3.  
  4. /**
  5.  * Clase Personal
  6.  *
  7.  * @author jose
  8.  */
  9. public class Personal implements Serializable {
  10.    
  11.     private String nick;
  12.     private String passwd;
  13.     private String nivel;
  14.  
  15.  
  16.     public Personal(String nick, String passwd, String nivel) {
  17.         this.nick = nick;
  18.         this.passwd = passwd;
  19.         this.nivel = nivel;
  20.     }    
  21.     Personal(){
  22.     }
  23.  
  24.     public String getNick() {
  25.         return nick;
  26.     }
  27.  
  28.     public void setNick(String nick) {
  29.         this.nick = nick;
  30.     }
  31.  
  32.     public String getPasswd() {
  33.         return passwd;
  34.     }
  35.  
  36.     public void setPasswd(String passwd) {
  37.         this.passwd = passwd;
  38.     }
  39.  
  40.     public String getNivel() {
  41.         return nivel;
  42.     }
  43.  
  44.     public void setNivel(String nivel) {
  45.         this.nivel = nivel;
  46.     }
  47.    
  48.    static public int buscarNick(String nick){
  49.        
  50.         for (int i = 0; i < Main.personal.size(); i++) {
  51.             if( Main.personal.get(i).getNick().equals(nick) ){
  52.                 return (i);
  53.             }else{
  54.                 return -1;
  55.             }
  56.         }
  57.         return -1;
  58.     }
  59.    
  60. }

Form.java
Código Java:
Ver original
  1. private Personal Personal;
  2.  
  3. if(Personal.buscarNick(nick)==-1){
  4.                
  5.                 Personal = new Personal(nick, passwd, nivel);
  6.                 Main.personal.add(Personal);
  7.                
  8.                 JOptionPane.showMessageDialog(this, "Se añadio correctamente");
  9.             }else{
  10.                 System.out.println("El usuario ya existe");
  11.                 JOptionPane.showMessageDialog(this, "El usuario ya existe");
  12.             }

Última edición por Jose789; 02/06/2017 a las 09:22
  #2 (permalink)  
Antiguo 02/06/2017, 11:05
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Evitar Duplicar datos

Buenas,

Hay algunas cosas que chocan un poco como Vector, que es una clase muy muy antigua de Java que no se utiliza debido a su mal diseno. Tambien el metodo find deberias sacarlo del bean e incorporarlo en otro componente aparte (Main quizas?). El codigo no es muy OO..., pero en fin, es normal porque estas aprendiendo.

Respecto a tu problema, por el codigo que pones deberia funcionar. Sin embargo sospecho que en la clase Form hay algo mas que haces que no nos estas mostrando... quizas reinicializas el vector en alguna parte? Puedes poner el codigo completo de Form.java?

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 02/06/2017, 12:03
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Evitar Duplicar datos

Te dejo por aquí todo el form, me acabo de dar cuenta de que el primer usuario que doy de alta si lo vuelvo a poner me dice perfectamente que el nombre ya existe en cambio si añado otro nuevo e intento con ese me deja crearlo y así sucesivamente.

https://pastebin.com/Tke39Grz

Si, soy novato en esto de la programación y actualmente estoy aprendiendo y puede que veas cada cosa que te quedes loco jaja. Espero que aparte de ayudarme en encontrar el error también me puedas dar algún consejo...

Veré como funcionan los arrayList para ir dejando a un lado el Vector.

Un saludo.

Un poco mas resumido.
Código Java:
Ver original
  1. private void button_add_personalActionPerformed(java.awt.event.ActionEvent evt) {                                                    
  2.         // TODO add your handling code here:
  3.        
  4.  
  5.         String nick = nick_personal.getText();
  6.         String passwd = passwd_personal.getText();
  7.         String rep_passwd = rep_passwd_personal.getText();
  8.         String nivel = nivel_personal.getSelectedItem().toString();
  9.        
  10.         if( (nick.isEmpty()) || (passwd.isEmpty()) || (rep_passwd.isEmpty()) ){
  11.             System.out.println("Campos Vacios");
  12.              JOptionPane.showMessageDialog(this, "Los campos no pueden estar vacios");
  13.         }else if( passwd.equals(nick)){
  14.             System.out.println("La contraseña no puede ser igual al nombre de usuario");
  15.              JOptionPane.showMessageDialog(this, "La contraseña no puede ser igual al nombre de usuario");
  16.         }else if( !(passwd.equals(rep_passwd)) ){
  17.              JOptionPane.showMessageDialog(this, "Las contraseñas no coinciden");
  18.         }else if( nivel.equals("Nivel") ){
  19.              JOptionPane.showMessageDialog(this, "Debe seleccionar un nivel de seguridad");
  20.         }else{
  21.            
  22.            if(Personal.buscarNick(nick)==-1){
  23.                
  24.                 Personal = new Personal(nick, passwd, nivel);
  25.                 Main.personal.add(Personal);
  26.                
  27.                 JOptionPane.showMessageDialog(this, "Se añadio correctamente");
  28.             }else{
  29.                 System.out.println("El usuario ya existe");
  30.                 JOptionPane.showMessageDialog(this, "El usuario ya existe");
  31.             }
  32.            
  33.         }
  34.        
  35.        
  36.        
  37.     }

Una prueba de ejecución


Si el usuario no existe retornara -1 si el usuario ya existe nos devuelve la pos en la que esta. A partir de ahí es cuando no para de dar siempre -1

Última edición por Jose789; 02/06/2017 a las 12:27
  #4 (permalink)  
Antiguo 02/06/2017, 14:36
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Evitar Duplicar datos

Ah vaya! acabo de verlo!

Para comprender lo que pasa, te propongo que pongas los siguientes mensajes:

Código Java:
Ver original
  1. static public int buscarNick(String nick){
  2.         System.out.println("Buscando nick " + nick);
  3.         System.out.println("Personal tiene " + Main.personal.size() + "elementos");
  4.         for (int i = 0; i < Main.personal.size(); i++) {
  5.             System.out.println("Analizando " + Main.personal.get(i).getNick() + "...");    
  6.             if( Main.personal.get(i).getNick().equals(nick) ){                
  7.                 return (i);
  8.             }else{
  9.                 System.out.println(Main.personal.get(i).getNick() + " no coincide. Retorno -1");    
  10.                 return -1;
  11.             }
  12.         }
  13.         return -1;
  14.     }

Deberias darte cuenta del problema al ejecutarlo y ver el comportamiento.

Gran pista: que haces si el primer elemento de la lista no se corresponde al nick buscado? acaso sigues buscando el resto de elementos del vector?


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 02/06/2017, 15:03
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Evitar Duplicar datos

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

Hay algunas cosas que chocan un poco como Vector, que es una clase muy muy antigua de Java que no se utiliza debido a su mal diseno. Tambien el metodo find deberias sacarlo del bean e incorporarlo en otro componente aparte (Main quizas?). El codigo no es muy OO..., pero en fin, es normal porque estas aprendiendo.

Respecto a tu problema, por el codigo que pones deberia funcionar. Sin embargo sospecho que en la clase Form hay algo mas que haces que no nos estas mostrando... quizas reinicializas el vector en alguna parte? Puedes poner el codigo completo de Form.java?

Un saludo
Para facilitarte las cosas y por aq
Código Java:
Ver original
  1. private void button_add_personalActionPerformed(java.awt.event.ActionEvent evt) {                                                    
  2.         // TODO add your handling code here:
  3.        
  4.  
  5.         String nick = nick_personal.getText();
  6.         String passwd = passwd_personal.getText();
  7.         String rep_passwd = rep_passwd_personal.getText();
  8.         String nivel = nivel_personal.getSelectedItem().toString();
  9.        
  10.         if( (nick.isEmpty()) || (passwd.isEmpty()) || (rep_passwd.isEmpty()) ){
  11.             System.out.println("Campos Vacios");
  12.              JOptionPane.showMessageDialog(this, "Los campos no pueden estar vacios");
  13.         }else if( passwd.equals(nick)){
  14.             System.out.println("La contraseña no puede ser igual al nombre de usuario");
  15.              JOptionPane.showMessageDialog(this, "La contraseña no puede ser igual al nombre de usuario");
  16.         }else if( !(passwd.equals(rep_passwd)) ){
  17.              JOptionPane.showMessageDialog(this, "Las contraseñas no coinciden");
  18.         }else if( nivel.equals("Nivel") ){
  19.              JOptionPane.showMessageDialog(this, "Debe seleccionar un nivel de seguridad");
  20.         }else{
  21.            
  22.            if(Personal.buscarNick(nick)==-1){
  23.                
  24.                 Personal = new Personal(nick, passwd, nivel);
  25.                 Main.personal.add(Personal);
  26.                
  27.                 JOptionPane.showMessageDialog(this, "Se añadio correctamente");
  28.             }else{
  29.                 System.out.println("El usuario ya existe");
  30.                 JOptionPane.showMessageDialog(this, "El usuario ya existe");
  31.             }
  32.            
  33.         }
  34.        
  35.        
  36.        
  37.     }

Me acabo de dar cuenta de que el Vector siempre me dice que el tamaño es de 0 elementos por lo que el for nunca se llega a invocar...

Ahora es cuando estoy en blanco....
  #6 (permalink)  
Antiguo 02/06/2017, 15:04
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Evitar Duplicar datos

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Ah vaya! acabo de verlo!

Para comprender lo que pasa, te propongo que pongas los siguientes mensajes:

Código Java:
Ver original
  1. static public int buscarNick(String nick){
  2.         System.out.println("Buscando nick " + nick);
  3.         System.out.println("Personal tiene " + Main.personal.size() + "elementos");
  4.         for (int i = 0; i < Main.personal.size(); i++) {
  5.             System.out.println("Analizando " + Main.personal.get(i).getNick() + "...");    
  6.             if( Main.personal.get(i).getNick().equals(nick) ){                
  7.                 return (i);
  8.             }else{
  9.                 System.out.println(Main.personal.get(i).getNick() + " no coincide. Retorno -1");    
  10.                 return -1;
  11.             }
  12.         }
  13.         return -1;
  14.     }

Deberias darte cuenta del problema al ejecutarlo y ver el comportamiento.

Gran pista: que haces si el primer elemento de la lista no se corresponde al nick buscado? acaso sigues buscando el resto de elementos del vector?


Un saludo
Me acabo de dar cuenta de que el Vector siempre me dice que el tamaño es de 0 elementos por lo que el for nunca se llega a invocar...

Ahora es cuando estoy en blanco....

PD: Fallo mio, vale ya veo que se queda en analizando,
PD2: Vale veo que me sobraba el else, ahora parece que funciona correctamente. corrígeme si me equivoco.

Última edición por Jose789; 02/06/2017 a las 15:12
  #7 (permalink)  
Antiguo 02/06/2017, 19:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Evitar Duplicar datos

Hola, apenas miré un poco el código te diría porque en forma de pregunta: ¿Porque no cambias por un HashMap? y te diré xq, sólo xq funciona mediante por clave-valor, tu puedes hacer busquedas con get o con containskey mediante la clave que sería el nick en tu caso.

https://www.mkyong.com/java/java-che...ts-in-hashmap/

Saludos.
  #8 (permalink)  
Antiguo 03/06/2017, 02:16
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Evitar Duplicar datos

Cita:
PD2: Vale veo que me sobraba el else, ahora parece que funciona correctamente. corrígeme si me equivoco.
Exacto, era eso.

Respecto al hashmap, es util si lo que se pretende hacer es basicamente hacer busquedas rapidas por una clave (fast lookup).

Si lo que se quiere es tener un a coleccion que deberemos recorrer, listar, filtrar, ordenar, etc (que creo que es el caso), lo adecuado es utilizar una lista (un ArrayList seria lo optimo aqui).

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 03/06/2017, 09:25
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 11 meses
Puntos: 4
Respuesta: Evitar Duplicar datos

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Exacto, era eso.

Respecto al hashmap, es util si lo que se pretende hacer es basicamente hacer busquedas rapidas por una clave (fast lookup).

Si lo que se quiere es tener un a coleccion que deberemos recorrer, listar, filtrar, ordenar, etc (que creo que es el caso), lo adecuado es utilizar una lista (un ArrayList seria lo optimo aqui).

Un saludo
Lo he vuelto a hacer con ArrayList y funciona todo correctamente. Muchas gracias por la ayuda.

Etiquetas: duplicar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:13.