Java - Unir dos ficheros de objetos en java

 
Vista:
sin imagen de perfil

Unir dos ficheros de objetos en java

Publicado por Carlos (1 intervención) el 06/01/2017 17:01:45
Hola, bueno hago este post para exponer el siguiente problema: Verán tengo dos archivos con extensión .dat, en el primer fichero tengo la siguiente información:

111111-A Antonio Garcia 22 H 77.0 1.75
222222-A Juan Marquez 33 H 60.0 1.72
333333-O Maria Perez 12 H 69.0 1.59
444444-Y Elisa Fernandez 18 M 55.0 1.63
555555-P Manuel Suarez 14 H 49.0 1.65

en el segundo fichero tengo esta información:

444444-Y Elisa Fernandez 19 M 53.0 1.63
101010-W Jose Gomez 28 H 55.0 1.73
111111-A Antonio Garcia 22 H 77.0 1.75

bien, lo que estoy tratando de hacer es comprobar si esta repetido el registro, y si esta repetido lo borro de la primera lista y añado en ese posicion el registro de la segunda. Y tambien comprobar si el registro esta solo en la segunda lista, en cuyo caso, se añade a la primera. Les enseño el codigo que llevo hecho hasta ahora, los datos de los ficheros se mostraran en una jtable, cualquier sugerencia o respuesta sera de gran ayuda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public ArrayList unirListas(String nombrefich, String nombrefich2){
 
    ArrayList<Persona> listaunida = new ArrayList<Persona>();
    FileInputStream f1,f2;
    ObjectInputStream i1,i2;
 
    try{
        f1=new FileInputStream(nombrefich);
        i1 = new ObjectInputStream(f1);
        Persona obj=null;
 
        f2=new FileInputStream(nombrefich2);
        i2 = new ObjectInputStream(f2);
        Persona obj2=null;
        try{
            obj=(Persona)i1.readObject();
            obj2=(Persona)i2.readObject();
 
              while(obj!=null && obj2!=null)
              {
                 if(obj2.getNombre().equals(obj.getNombre())){
                     obj.setNombre(obj2.getNombre());
                     listaunida.add(obj);
                     System.out.println("Prueba");
                 }
              }
        }
        catch (ClassNotFoundException ex) {
            Logger.getLogger(ControlArchivo.class.getName()).log(Level.SEVERE, null, ex);
        }
 
        finally {
                //JOptionPane.showMessageDialog(null, "Proceso finalizado.");
            i1.close();
            i2.close();
          }
 
    }
 
    catch (IOException ex) {
        Logger.getLogger(ControlArchivo.class.getName()).log(Level.SEVERE, null, ex);
    }
    return listaunida;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rafael Angel
Val: 492
Bronce
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ficheros de objetos en java

Publicado por Rafael Angel (4 intervenciones) el 22/04/2019 08:06:06
Estas usando un while para dos objetos que tienen tamaños diferentes.
Creo que mejor deberías pasar todos los datos a un vector o dejarlos así es decision tuya, pero podrías realizar lo siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
String datos="";
while(obj2!=null)
{
   while(obj!=null ){
       if(obj2.getNombre().equals(obj.getNombre())){
          obj.setNombre(obj2.getNombre());
          listaunida.add(obj);
          datos+="Objeto agregado " + obj.getNombre() + "\n;
        }//end if
   }//end while interno.
}
System.out.println(datos);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ficheros de objetos en java

Publicado por Rodrigo (623 intervenciones) el 22/04/2019 09:36:33
Puesto que pides comentarios, aqui van los mios:

Puedes simplificar enormemente el codigo de lectura de archivos usando lo que se llama "try with resources".

Esencialmente, pones la instruccion de apertura del archivo al interior de try y eliminas del codigo el close.

Mira aqui por ejemplo: http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html

La funcion es optimista y cree que todos los datos caben en un ArrayList, en memoria.
Dado esto, sugiero mejor leer todo el primer archivo y copiarlo en un ArrayList, leer todo el segundo archivo y ponerlo en un arraylist, y luego olvidarse de los archivos y hacer la operacion de union usando los ArrayList solamente.

1
2
3
List<Persona> personas1 = leerArchivo(nombre_archivo1);
List<Persona> personas2 = leerArchivo(nombre_archivo2);
List<Persona> listafinal = unirListas(personas1, personas2);

Especifica el tipo del arrayList en el retorno de la funcion, no como lo tienes aqui public ArrayList nombreFuncion, sino public ArrayList<Persona>, y dado que usamos ArrayList, mejor aun, usa la interfaz List en el retorno de la funcion, asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// implementar la lectura del archivo nombreArchivo hacia una lista
public List<Persona> leerArchivo(String nombreArchivo) {
 List<Persona> personas = new ArrayList<>();
 
  // ..
  return personas;
}
 
// generar lista final, actualizar lo de lista1 presente en lista2, agregar lo nuevo de lista2
public List<Persona> unirListas(List<Persona> lista1, List<Persona> lista2) {
 List<Persona> listafinal = new ArrayList<>();
 
 // ...
 return listafinal;
}

La implementacion de unirListas podria hacerse inicialmente con "fuerza bruta", osea:
- leer uno por uno los elementos de la lista1 y por cada uno de ellos
- buscarlo en lista2.
- - si no esta, agregarlo a la listafinal.
- - si esta, agregar lo que esta en lista2 a la listafinal
despues de completar esto hacer la pasada por la lista2 para unir todos los elementos que no estan en la lista1.

Dado que tienes que hacer esta operacion de union y hacer comprobaciones de pertenencia a conjuntos, una ultima sugerencia es cambiar el usar ArrayList por usar Map mejor en los pasos intermedios y solo al final usar un ArrayList, si es que requieres esto para llenar la tabla.
Con eso simplificas el tener que buscar datos en conjuntos. Podrias usar el nombre o algun Id unico como clave del map para saber cuando un elemento esta en otro conjunto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 // implementar la lectura del archivo nombreArchivo hacia un Map
public Map<String, Persona> leerArchivo(String nombreArchivo) {
 Map<String, Persona> personas = new HashMap<>();
 
  // ..
  return personas;
}
 
// generar lista final, actualizar lo presente en map1 con lo de map2, agregar lo nuevo de map2
public List<Persona> unirListas(Map<String,Persona> map1, Map<String, Persona> map2) {
 
  Map<String,Persona> personas = new HashMap<>();
  personas.putAll(map1);
  personas.putAll(map2);
 
  List<Persona> listafinal = new ArrayList<>();
  // ...
 return listafinal;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ficheros de objetos en java

Publicado por Rodrigo (623 intervenciones) el 22/04/2019 09:55:31
no alcance a editar la ultima funcion. Quedaria algo asi:

1
2
3
4
5
6
7
8
9
public List<Persona> unirListas(Map<String,Persona> map1, Map<String, Persona> map2) {
 
  Map<String,Persona> personas = new HashMap<>();
  personas.putAll(map1);
  personas.putAll(map2);
 
  List<Persona> listafinal = new ArrayList<>(personas.values());
  return listafinal;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar