Java - Unir dos ArrayList en los que coincide un dato

 
Vista:
Imágen de perfil de Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 25/04/2021 16:37:59
Hola

Estoy tratando de unir dos ArrayList en los que conicide un dato, y no soy capaz.
Los datos de los Arraylist los obtengo de consultas a tablas de una base SQL Server

En el primer ArrayList, tengo las reservas:
1
2
3
4
5
6
7
8
9
ArrayList reservas = new ArrayList();
while (rs.next()) {
            reservas.add(rs.getString("SalaID") +
                        "   " + rs.getString("FechaReserva") +
                        "   " + rs.getString("HoraReserva") +
                        "   " + rs.getString("SocioID") +
                        "   " + rs.getString("HoraReserva2") +
                        "   " + rs.getString("HoraReserva3"));
}

En el segundo ArrayList, tengo los datos de los socios que hacen esas Reservas:
1
2
3
4
5
ArrayList socios = new ArrayList();
while (ra.next()) {
    socios.add(ra.getString("f_ConsumerNO") +
            "   " + ra.getString("f_ConsumerName"));
}

En ambos arrayList, coincide el n´número de Socio (SocioID en ArrayList "reservas", f_ConsumerNO en ArrayList "socios")

Desearía añadir el campo f_ConsumerName del Arraylist "socios" y todos los campos del ArrayList "reservas"

En éste código, lo que trataba de hacer, era sustituir el valor del campo SocioID del ArrayList "reservas" por el valor f_ConsumerName del ArrayList "socios", de tal manera que en lugar de darme el número de socio, me diera su nombre
1
2
3
4
5
6
7
8
Iterator it = reservas.iterator();
while(it.hasNext()){
    String Nsocio = reservas.get(3).toString();
    String NumSocio = socios.get(0).toString();
    if (Nsocio.equals(NumSocio)){
        reservas.set(3, socios.get(1).toString());
    }
}

Pero no me funciona, y trato de seguir manuales por internet, y nada, no doy con la solución.
Alguien me puede decir como hacerlo ?

Gracias
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
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Yamil (2315 intervenciones) el 25/04/2021 17:00:25
Segun el codigo que has publicado tienes en reservas algo como

01 31/01/2021 12:12:12 100 01:01:01 02:02:02
...

y en socios tienes
01 Pedro Perez
02 Juan Rodriguez
...

Asi que cuando haces, reservas.get(3).toString()
Lo que estas haciendo es tomando el elemento del ArrayList reservas en la posicion 4(empieza desde 0) y
no el dato que te representa el socioId


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private string findNombreSocio(string reserva) {
  string nombreSocio = ""
 
  // Ubica socioId en la reserva
  string [] tokens = reserva.split(" ")
  socioId = tokens[3]
 
  // Ahora busca el nombre del socio
  for (int i=0; i < socios..size(); i++) {
     String str = socios.get(i).toString()
	 String[] parts = str.split(" ");
 
	 // f_ConsumerNO esta en la posicion 0
	 if (idSocio.equals(parts[0])) {
	    nombreSocio = parts[1]
		break;
	 }
  }
 
  return nombreSocio
}


y ahora para saber en reservas si es socio haces algo como

1
2
3
4
5
6
7
8
for (int i =0; i < reservas.size(); i++) {
  string reserva = reservas.get(i).toString();
  nombreSocio = findNombreSocio(reserva);
  if (nombreSocio.length() > 0) {
     reserva[3] = nombreSocio;
	 reservas.set(i, Arrays.toString(reserva);
  }
}
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 25/04/2021 17:23:53
Uff, muchas gracias por la respuesta

Y muchos datos para estudiar en ella, me pondré a ver si lo entiendo

Lo único, que respecto a la posición que me indicas:

[0].........[1]...............[2].......[3].......[4]............[5]
01 31/01/2021 12:12:12 100 01:01:01 02:02:02
Donde: [0] - "SalaID"
[1] - "FechaReserva"
[2] - "HoraReserva"
[3] - "SocioID"
[4] - "HoraReserva2
[5] - "HoraReserva3"
Por lo que la posición [3] se correspondería con el número de socio ¿no?

Es que ésto no acabo de entenderlo:
Asi que cuando haces, reservas.get(3).toString()
Lo que estas haciendo es tomando el elemento del ArrayList reservas en la posicion 4(empieza desde 0) y
no el dato que te representa el socioId
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
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Yamil (2315 intervenciones) el 26/04/2021 04:32:02
La posicion la tienes dentro del ArraList donde una posicion tiene todos los campso separados por un blanco. Es decir, si haces reservas[3] no te retorna el Id del socio del registro actual sino todo el registro en la posicion 3. Pro ejemplo

0 - 01 31/01/2021 12:12:12 100 01:01:01 02:02:02
1 - 01 31/01/2021 12:12:12 100 01:01:01 02:02:02
2 - 01 31/01/2021 12:12:12 100 01:01:01 02:02:02
3 - 01 31/01/2021 12:12:12 100 01:01:01 02:02:02 <-- este es reservas.get(3)
4 ...
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 26/04/2021 10:01:35
Ahh, ok ok, muchas gracias

Si que me daba cuenta que al depurar línea a línea, me sacaba todo los registros de la fila y no entendía porqué, bueno, en realidad, lo sigo sin entender, jeje.

Y como debería de hacer para obtener simplemente el registro de la tercera columna ?

Por cierto Yamil, tu código me da error al meterlo en mi proyecto.
1
2
3
4
5
6
7
8
for (int i =0; i < reservas.size(); i++) {
    String reserva = reservas.get(i).toString();
    String nombreSocio = metodoNombreSocio(reserva);
    if (nombreSocio.length() > 0) {
        reserva[3] = nombreSocio;
        reservas.set(i, ArrayList.toString(reserva);
    }
}

La primera parte sin problema, pero en ésta última, me pone en rojo reserva[3] y toString

errores
metodoYamil

Un saludo y muchas gracias
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 26/04/2021 16:23:35
Hola de nuevo Yamil

estoy dándole vueltas a tu solución, y por desgracia, no me recoge el dato del arrayList
Lo deja como " ". En la posición [3], tomaba la fecha, en la posición [4] no recoje ningún valor


captura1-metodo


captura2-metodo
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
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Yamil (2315 intervenciones) el 27/04/2021 03:54:32
Imprime lo que tiene tokens a ver...
Disculpa te envie un codigo errado. Este debria funcionar

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
private string findNombreSocio(string [] reservaArray) {
  string nombreSocio = ""
 
  // Ubica socioId en la reserva
  socioId = reservaArray[3]
 
  // Ahora busca el nombre del socio
  for (int i=0; i < socios..size(); i++) {
     String str = socios.get(i).toString()
	 String[] parts = str.split(" ");
 
	 // f_ConsumerNO esta en la posicion 0
	 if (idSocio.equals(parts[0])) {
	    nombreSocio = parts[1]
		break;
	 }
  }
 
  return nombreSocio
 
}
 
for (int i =0; i < reservas.size(); i++) {
  string reserva = reservas.get(i).toString();
  string [] reservaArray = reserva.split(" ")
 
  nombreSocio = findNombreSocio(reservaArray);
  if (nombreSocio.length() > 0) {
 
     reservaArray[3] = nombreSocio;
	 reservas.set(i, Arrays.toString(reservaArray);
  }
}
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 27/04/2021 20:38:33
Muchísimas gracias Yamil, me ha funcionado

He tenido que adaptarlo, pues en mis ArrayList tenía varios espacios en blanco, y por eso no me extraía el dato correcto

Me quedó de la siguiente manera:
Añadir una línea para borrar los seis primeros caracteres del String, pues me los ponía como espacios
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
private String metodoYamilNombreSocio(String[] reservaArray)
{
    String nombreSocio = "";
 
    // Ubica socioId en la reserva
    String socioId = reservaArray[3];
 
    // Ahora busca el nombre del socio
 
    for (int i=0; i < socios.size(); i++)
    {
        String str = socios.get(i).toString();
 
        String cadena_a, cadena_b = str;
        //Borramos los primeros cinco caracteres.
        cadena_a = cadena_b.substring(6);
 
        String[] parts = cadena_a.split("   ");
 
        // f_ConsumerNO esta en la posicion 0
        if (socioId.equals(parts[0]))
        {
            nombreSocio = parts[1];
            break;
        }
    }
    return nombreSocio;
}

Tanto en la clase anterior como en el buble, en lugar de poner un espacio a buscar, he tenido que agregar tres
1
2
3
4
5
6
7
8
9
10
11
12
for (int i =0; i < reservas.size(); i++)
{
    String reserva = reservas.get(i).toString();
    String[] reservaArray = reserva.split("   ");
    String nombreSocio = metodoYamilNombreSocio(reservaArray);
 
    if (nombreSocio.length() > 0)
    {
        reservaArray[3] = nombreSocio;
        reservas.set(i, Arrays.toString(reservaArray));
    }
}

Me has quitado un gran quebradero de cabeza. Eternamente agradecido.
Un saludooooooooo
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 30/04/2021 18:38:44
Hola de nuevo Yamil

Se que estoy abusando de tu confianza, pero vuelvo a necesitar tu ayuda, si es posible

Tenía el código funcionando correctamente, pero para ver los resultados, lo hacía en un adapter del sistema, que son muy precarios y tienen muy poca posibilidad de formatear al gusto de cada uno

El caso es que he conseguido sacar los datos en un adapter personalizado, pero para ello he tenido que cambiar código, y ahora tu aporte anterior, me da errores, podrías ayudarme a corregirlos ?

En principio solo me da un error en ésta línea:
dataN.set(i, Arrays.toString(reservaArray));

llamar3

Este es el codigo final completo:

llamar2

y el método desde donde se llama a la clase anterior

llenar1

Un saludoooo
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 Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Billy Joel (874 intervenciones) el 30/04/2021 20:50:21
ListView es JavaFX o Android?
Es que siento que te has hecho un lío.

PD: Creo que es android. Acabo de ver lo del SimpleAdapter y creo que tengo una solución. Pronto la coloco

Saludos,
Billy Joel
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 30/04/2021 22:10:54
Hola Billy, gracias por contestar

estoy con java en android studio
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 Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Billy Joel (874 intervenciones) el 02/05/2021 00:30:25
Creo que debo abordar el problema desde el principio.
Tienes dos tablas:
- t_b_Consumer
- Reservas

Tu pregunta es como relacionar los datos del consumer con las reservas.
Sospecho que quieres mostrar los datos de las reservas por sala.
Entonces la solucióin sería una consulta:
1
String sql = "select r.SalaID as Sala, r.FechaReserva as Fecha, r.HoraReserva as Hora, c.f_ConsumerName as Socio from Reservas r, t_b_Consumer c where r.SocioID = c.f_ConsumerNo and SalaID = ?";

El signo "?" es un parámetro que sería el número de la sala. Ahora lo verás funcionar queda bien mamalón

Si lo que quieres es colocar el resultado en un SimpleAdapter te propongo lo siguiente:
Un método para ejecutar consultas (querys)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
 * Ejecuta una consulta a la base de datos
 *
 * @param sql consulta SQL que se va a ejecutar. Los parámetros deben ser
 * reepmplazados con el signo "?"
 * @param params Lista de parámetros que tendrá la consulta. Si la consulta
 * no tiene parámetros entonces se debe enviar null
 * @return Devuelve el resultado listo para ser utilizado en un
 * SimpleAdapter
 */
public List<Map<String, String>> exeQuery(String sql, String[] params) {
    Connection cn = null;
    PreparedStatement pst = null;
    ResultSet rs;
    List<Map<String, String>> ls = null;
    try {
        cn = miConexion.metodoConexionBD();
        pst = cn.prepareStatement(sql);
        if (params != null && sql.contains("?")) {
            for (int i = 0; i < params.length; i++) {
                pst.setObject(i + 1, params[i]);
            }
        }
        rs = pst.executeQuery();
        String[] cols = new String[rs.getMetaData().getColumnCount()];
        for (int i = 0; i < cols.length; i++) {
            cols[i] = rs.getMetaData().getColumnName(i + 1);
        }
        ls = new ArrayList();
        while (rs.next()) {
            Map<String, String> m = new HashMap();
            for (int i = 0; i < cols.length; i++) {
                m.put(cols[i], rs.getString(i + 1));
            }
            ls.add(m);
        }
    } catch (SQLException ex) {
        System.out.println("Error al ejecutar query: " + sql);
        System.out.println(ex);
    } finally {
        try {
            if (pst != null && !pst.isClosed()) {
                pst.close();
            }
            if (cn != null && !cn.isClosed()) {
                cn.close();
            }
        } catch (SQLException ex) {
        }
    }
    return ls;
}
 
/**
 * Ejecuta una consulta a la base de datos
 *
 * @param sql consulta SQL que se va a ejecutar.
 * @return Devuelve el resultado listo para ser utilizado en un
 * SimpleAdapter
 */
public List<Map<String, String>> exeQuery(String sql) {
    return exeQuery(sql, null);
}

El método lo podríamos invocar así:
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
/**
 * Muestra las reservas
 * @param salaNo El número de sala
 */
public void metodoMostrarReservas(String salaNo) {
    String sql = "select r.SalaID as Sala, "
            + "r.FechaReserva as Fecha, "
            + "r.HoraReserva as Hora, "
            + "c.f_ConsumerName as Socio "
            + "from Reservas r, t_b_Consumer c "
            + "where r.SocioID = c.f_ConsumerNo "
            + "and SalaID = ?";
    List<Map<String, String>> myDataList = exeQuery(sql, new String[]{salaNo});
    String[] fromV = {"Sala", "Fecha", "Hora", "Socio"};
    int[] tow = {
        R.id.edt_vReservas_sala,
        R.id.edt_vReservas_fecha,
        R.id.edt_vReservas_Horas1,
        R.id.edt_vReservas_socio,
        R.id.edt_vReservas_Horas2,
        R.id.edt_vReservas_Horas3,
    };
    ad = new SimpleAdapter(PaginaListaRroco.this, myDataList, R.layout.vista_reservas, FromV, tow);
    lista_Reservas.setAdapter(ad);
}

Cuentame!!

Saludos,
Billy Joel
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 Roberto
Val: 40
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Unir dos ArrayList en los que coincide un dato

Publicado por Roberto (13 intervenciones) el 02/05/2021 00:59:12
Hola Billy Joel, muchas gracias por tu respuesta

Uf, la verdad que para un principiante como yo, me lo has puesto bastante complicado de entender, a ver si lo logro

Sobre la consulta a las dos tablas por SQL, sería lo más sencillo y rápido, pero por causas que desconozco, no me deja hacer consultas entre la base de datos del sistema de accesos y mi propia base de datos, que luego he unido en SQL Server

La base de datos del sistema de accesos está en Access, y he realizado una vinculación a SQL Server
Mi base de datos, que hice para efectuar las reservas, la programé directamente en SQL Server
He puesto las dos unidas, pero no me deja relacionarlas y no me deja trabajar con ellas de forma simultánea, supongo que por algún tipo de protección que desconozco
Sin embargo, por separado, me deja hacer consultas sin problema conbinando tablas siempre que sea de una u otra base de datos

Pues lo dicho, a ver si puedo darle forma a tu código y consigo adaptarlo a mi proyecto

Muhas graciasssss
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