Java - Crear metodo que devuelva dos valores de tipos diferentes

 
Vista:
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por jose (73 intervenciones) el 01/11/2018 13:43:49
Hola a todos,

Estoy haciendo un programa en el que llama a un método en una clase.

1
dades.cercaDescripcioProducte(codiProducto, productes, validar);

El método ha de buscar el código de un producto, si no existe que retorne nulo, pero si existe quiero que me envie el valor de un boolean aparte de un String.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public String cercaDescripcioProducte(String pCodiProducte, String[][] productes, boolean validar) {
    // A partir del Codi del producte es tornarà la Descripció del producte,
    // en cas que el producte no existeixi es retornarà: return “”;
 
    String validarString = null;
    for (int i = 0; (i < productes.length); i++) {
        if (productes[i][0] != null) {
            if (productes[i][0].equalsIgnoreCase(pCodiProducte)) {
                validarString = "El codígo de producto ya existe\n"+
            " la descripción del producto es" + productes[i][1] +
            " el PVP es: " + productes[i][2];
            validar = true;
            }
        }
    }
 
    return validarString;
}

He encontrado la forma de hacerlo pero retornando dos valores del mismo tipo.

¿Alguien sabe como hacerlo?

Muchas 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
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

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por Billy Joel (876 intervenciones) el 01/11/2018 15:28:36
Hay varias formas de hacer lo que quieres, pero todo depende el enfoque que le quieras dar.
En tu código veo que verificas si el parámetro pCodiProducte se encuentra dentro del arreglo bidimecional productes. Además envías un tercer parámetro validar No se para que o que función tiene

No se que es lo que tiene en la segunda dimensión, pero vamos a suponer que tiene los siguientes campos: codigo, nombre, descripcion, pvp, precio, stock, activo. Entonces primero creamos un bean (una clase con propiedades + sets & gets) de Productes Para seguir tu standard
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public class Productes {
    private String codigo;
    private String nombre;
    private String descripcion;
    private String pvp;
    private Double precio;
    private Integer stock;
    private boolean activo;
 
    /**
     * @return the codigo
     */
    public String getCodigo() {
        return codigo;
    }
 
    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }
 
    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }
 
    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
 
    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }
 
    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
 
    /**
     * @return the precio
     */
    public Double getPrecio() {
        return precio;
    }
 
    /**
     * @param precio the precio to set
     */
    public void setPrecio(Double precio) {
        this.precio = precio;
    }
 
    /**
     * @return the stock
     */
    public Integer getStock() {
        return stock;
    }
 
    /**
     * @param stock the stock to set
     */
    public void setStock(Integer stock) {
        this.stock = stock;
    }
 
    /**
     * @return the activo
     */
    public boolean isActivo() {
        return activo;
    }
 
    /**
     * @param activo the activo to set
     */
    public void setActivo(boolean activo) {
        this.activo = activo;
    }
 
    /**
     * @return the pvp
     */
    public String getPvp() {
        return pvp;
    }
 
    /**
     * @param pvp the pvp to set
     */
    public void setPvp(String pvp) {
        this.pvp = pvp;
    }
}

Entonces modificando un tanto el método de busqueda lo dejo así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Productes cercaDescripcioProducte(String pCodiProducte, String[][] productes) {
    // A partir del Codi del producte es tornarà la Descripció del producte,
    // en cas que el producte no existeixi es retornarà: return “”;
    Productes p = null;
    for (int i = 0; (i < productes.length); i++) {
        if (productes[i][0] != null && productes[i][0].equalsIgnoreCase(pCodiProducte)) {
            p = new Productes();
            p.setCodigo(productes[i][0]);
            p.setDescripcion(productes[i][1]);
            p.setPvp(productes[i][2]);
            //Suponiendo que el producto además tiene nombre, precio, stock y activo
            p.setNombre(productes[i][3]);
            p.setPrecio(Double.parseDouble(productes[i][4]));
            p.setStock(Integer.parseInt(productes[i][5]));
            p.setActivo(Boolean.parseBoolean(productes[i][6]));
        }
    }
    return p;
}

Entonces para utilizar este nuevo método desde donde lo llamas, yo lo haría así:
1
2
3
4
5
6
7
8
9
Productes product = cercaDescripcioProducte(pCodiProducte, productes);
String validarString;
if (product != null) {
    validarString = "El código de producto ya existe"
            + "\nLa descripción del producto es: " + product.getDescripcion()
            + "\nEl PVP es: " + product.getPvp();
} else {
    validarString = "El código de producto no existe";
}


Espero te sirva...
Saludos!!
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 jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por jose (73 intervenciones) el 01/11/2018 15:59:05
Hola Billy Joel,

Gracias por la rápida respuesta. Por desgracia hay cosas que no puedo modificar. El profesor nos ha dado un código para rellenar y de hay no podemos pasar.

Mi intención es retornar desde public String cercaDescripcioProducte(String pCodiProducte, String[][] productes, boolean validar) que está en una clase aparte un string y un boolean.

El boolean vale para modificar una variable boolean en true con el propósito de que si es false (si no encuentra datos) llame a otro método para insertarlos en un array.

No sé de qué otra manera hacerlo.
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

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por Billy Joel (876 intervenciones) el 01/11/2018 16:37:13
Hay un truco y se llama pase por referencia. En Java las variables cuando se envían a los parámetros se envían por valor, pero los objetos pasan por referencia.

Entonces tu tienes la variable validarString que es la que retorna el método.
Tienes un parámetro validar que es tipo boolean.
1
public String cercaDescripcioProducte(String pCodiProducte, String[][] productes, boolean validar) {

Según entiendo quieres que el método también devuelva un segundo valor y ese sería validar
Para lograr esto lo que se hace es lo siguiente:
1
public String cercaDescripcioProducte(String pCodiProducte, String[][] productes, Boolean validar) {

Y desde el lugar donde invocas este método, la variable validar la vas a declarar como un objeto
1
Boolean validar = new Boolean(false);

De esta forma el método cercaDescripcioProducte te va a devolver un String y también tendrás el valor de validar
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 jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por jose (73 intervenciones) el 01/11/2018 16:56:54
Hola Billy Joel,

Con ello cambiaría la variable boolean en la clase principal?
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

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por Billy Joel (876 intervenciones) el 01/11/2018 17:03:41
Si y no.
En lugar de declararla como una variable primitiva, la vas a declarar como un objeto.
Yo supongo que la declaras como:
1
boolean validar = false;

El cambio que te propongo es declararla así
1
Boolean validar = new Boolean(false);
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 jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por jose (73 intervenciones) el 01/11/2018 17:23:52
Muchas gracías Billy Joel,

Lo he dejado así, sería correcto: (Perdona si está en catalán, nos lo pasan así)

Clase principal.

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
private void afegirAlCarro(String[][] productes, String[][] carroCompra) {
    String codiProducto = null;
    Boolean validar = new Boolean(false);
    String descripcion = null;
    int cantidad = 0,PVP = 0;
 
    // Es demanara el codi del producte que es vol comprar,
    System.out.print("\nIntrodueix el codi del producte que desea comprar: ");
    codiProducto = scanner.next();
    if (codiProducto.equalsIgnoreCase("fi")) {
        finalitza = true;
        return;
    }
 
    // es comprovarà si existeix en l’array de «productes»,
    // en cas afirmatiu mostrarà la descripció del producte i el PVP,
    dades.cercaDescripcioProducte(codiProducto, productes, validar);
    // Codi productes, Descripció , PVP
    //Pasamos PVP de int a String para añadirlo al array
    String StPVP = String.valueOf(PVP);
    for (int i=0; i<productes.length;i ++ ) {
        if (productes[i][0]==codiProducto) {
        descripcion = productes[i][1];
        StPVP = productes[i][2];
        }
    }
 
    if (validar==true) {
        // llavors demanarà la quantitat o unitats que es volen comprar
        System.out.print("\nIntrodueix la cantidad de producte que desea comprar: ");
        cantidad = scanner.nextInt();
        //Pasamos cantidad de int a String para que acepte "fi"
        String Stcantidad = String.valueOf(cantidad);
        if (Stcantidad.equalsIgnoreCase("fi")) {
            finalitza = true;
            return;
        }
        //dades.afegirAlCarro(codiProducte, descripcio, pvp, quantitat, carroCompra);
        //Comprobar que no existe el producto
        dades.afegirAlCarro(codiProducto, descripcion, PVP,cantidad,carroCompra);
    }
}

Clase secundaria

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class dadesAplicacio {
 
	public String cercaDescripcioProducte(String pCodiProducte, String[][] productes, Boolean validar) {
		// A partir del Codi del producte es tornarà la Descripció del producte,
		// en cas que el producte no existeixi es retornarà: return “”;
 
		String validarString = null;
		validar = new Boolean(false);
		for (int i = 0; (i < productes.length); i++) {
			if (productes[i][0] != null && productes[i][0].equalsIgnoreCase(pCodiProducte)) {
				validarString = "El codígo de producto ya existe\n"+
				" la descripción del producto es" + productes[i][1] +
				" el PVP es: " + productes[i][2];
				validar = true;
				}
			}
 
		return validarString;
	}
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

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por Billy Joel (876 intervenciones) el 01/11/2018 17:34:09
Solo comenta validar = new Boolean(false); en la clase dadesAplicacio
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<public String cercaDescripcioProducte(String pCodiProducte, String[][] productes, Boolean validar) {
    // A partir del Codi del producte es tornarà la Descripció del producte,
    // en cas que el producte no existeixi es retornarà: return “”;
    String validarString = null;
    //validar = new Boolean(false);
    for (int i = 0; (i < productes.length); i++) {
        if (productes[i][0] != null && productes[i][0].equalsIgnoreCase(pCodiProducte)) {
            validarString = "El codígo de producto ya existe\n"+
            " la descripción del producto es" + productes[i][1] +
            " el PVP es: " + productes[i][2];
            validar = true;
        }
    }
    return validarString;
}
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

Crear metodo que devuelva dos valores de tipos diferentes

Publicado por Tom (1831 intervenciones) el 01/11/2018 18:32:40
A ver. La solución que comentan no es válida en java. Lo del pase por referencia ... como que no, estás pasando una referencia a Boolean, que es inmutable.
Tu necesidad surge de un mal diseño.
En tu caso concreto cuando retornas un String distinto de null, también retornarías un boolean a true, solamente en esa circunstancia (según el código que has pegado).
Pues ome:
1
2
String msg = cercaDescripcioProducte(...);
Boolean validar = (msg != null);
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