Java - Comparar valores de un enum con parámetro de entrada

 
Vista:
sin imagen de perfil

Comparar valores de un enum con parámetro de entrada

Publicado por Xavi (21 intervenciones) el 13/11/2021 10:39:15
Hola,

Estoy intentando crear un método llamado isPreceding que devuelva un booleano indicando cuál de los dos valores del enum va antes. La casuística es la siguiente:

- Si el valor del enum que llama al método va antes que el valor del enum que se pasa por parámetro, entonces devuelve true.
- En caso contrario, devuelve false.
- En caso que sean iguales, devuelve null.

En este sentido, el enum que he definido y sus métodos es el siguiente:

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
import java.util.Arrays;
 
public enum Position {
 
    GOALKEEPER("BLACK"),
    DEFENDER("RED"),
    MIDFIELDER("GREEN"),
    FORWARD("BLUE");
    // Variable local
    private String color;
 
    // Constructor que guarda el parametro color
    private Position(String color){
        this.color=color;
    }
 
    // Obtenemos el color
    public String getColor() {return color;}
 
 
    public static String [] getColors() {
        return Arrays.stream(Position.values()).map(Position::getColor).toArray(String[]::new);
    }
 
    @Override
    public String toString(){
        //Imprimimos los nombres del enum
        return name();
    }
 
    public static Position getPositionByColor(String color){
        // Black serà Goalkeeper
        if(color.equals("BLACK")) {return Position.GOALKEEPER;}
        // Red serà Defender
        if(color.equals("RED")) {return Position.DEFENDER;}
        // Green serà midfielder
        if(color.equals("GREEN")) {return Position.MIDFIELDER;}
        // Blue serà forward
        if(color.equals("BLUE")) {return Position.FORWARD;}
        // Cualquier otro caso
        else {return null;}
    }
 
    public boolean isPreceding(Position position){
        Position [] posiciones = Position.values();
        for(int f=0; f < posiciones.length; f++){
            if(posiciones[f] == position) {
                return Boolean.parseBoolean(null);
            }else if(){
            //TODO
 
            }
        }
 
    }
 
}

En el código que he creado para el método isPreceding le estoy pasando como parámetro de entrada un objeto Position. En este sentido, si se pasa DEFENDER como parámetro i se llama al método des de GOALKEEPER, entonces tiene que devolver true. Si fuera al inrevés, devolvería false ya que GOALKEEPER va antes que DEFENDER en la definición del enum.

Creo que he creado bien la casuística para cuando el parámetro de entrada es igual al valor del enum pero no se hacer las otras dos comparaciones, igual hay una forma más fácil.

Por si ayuda, he creado algunos tests de verificación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
	void testOrder() {
		position = Position.DEFENDER;
		assertFalse(position.isPreceding(Position.GOALKEEPER));
		assertTrue(position.isPreceding(Position.MIDFIELDER));
		assertTrue(position.isPreceding(Position.FORWARD));
		assertTrue(position.isPreceding(Position.DEFENDER));
 
		position = Position.FORWARD;
		assertFalse(position.isPreceding(Position.MIDFIELDER));
		assertFalse(position.isPreceding(Position.DEFENDER));
		assertFalse(position.isPreceding(Position.GOALKEEPER));
		assertTrue(position.isPreceding(Position.FORWARD));
 
		position = Position.GOALKEEPER;
		assertTrue(position.isPreceding(Position.MIDFIELDER));
		assertTrue(position.isPreceding(Position.DEFENDER));
		assertTrue(position.isPreceding(Position.FORWARD));
	}


Gracias de antemano.
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

Comparar valores de un enum con parámetro de entrada

Publicado por Xavi (21 intervenciones) el 13/11/2021 12:19:13
Ya se soluciono de una forma mucho más sencilla. Adjunto código:

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
public enum Position {
 
    GOALKEEPER("BLACK"),
    DEFENDER("RED"),
    MIDFIELDER("GREEN"),
    FORWARD("BLUE");
    //Ya que el color no va a cambiar, lo hacemos final
    private final String color;
 
    //El constructor de enum siempre es private, no hay necesidad de declararlo como tal
    Position(String color){
        this.color=color;
    }
 
    public String getColor() {return color;}
 
 
    public static String [] getColors() {
        return Arrays.stream(Position.values()).map(Position::getColor).toArray(String[]::new);
    }
 
    @Override
    public String toString(){
        return name();
    }
 
 
 
    public static Position getPositionByColor(String color){
        // Black serà Goalkeeper
        if(color.equals("BLACK")) {return Position.GOALKEEPER;}
        // Red serà Defender
        if(color.equals("RED")) {return Position.DEFENDER;}
        // Green serà midfielder
        if(color.equals("GREEN")) {return Position.MIDFIELDER;}
        // Blue serà forward
        if(color.equals("BLUE")) {return Position.FORWARD;}
        // Cualquier otro caso
        else {return null;}
    }
 
    /*
     * Aquí está el principal cambio. Ya que queremos saber si el position recibido como parámetro
     * va antes que el actual, devolvemos el resultado de compareTo < 0, es decir, si compareTo nos devuelve
     * -1 porque el position que comparamos efectivamente está antes, -1 es menor que 0, así que devolvemos true.
     * Para todos los demás casos, devolvemos false. Por qué he eliminado el parseBoolean? Pues porque hacer
     * Boolean.parseBoolean(null) en realidad te devuelve false, ya que boolean es un tipo primitivo
     * y los primitivos en java nunca pueden ser null.
     * El método compareTo devolverá lo siguiente:
     *     0 cuando sean iguales: 0 < 0 == false
     *     1 cuando sea "mayor": 1 < 0 == false
     *     -1 cuando sea menor: -1 < 0 == true
     * Con estos resultados, podemos modificar ligeramente los test para que encajen en la nueva lógica
     */
    public boolean isPreceding(Position position){
        return this.compareTo(position) < 0;
    }
}
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