Listado completo de tutoriales

80 - Operador condicional: (condicion)?valor1:valor2


Cuando hay que tomar decisiones dentro de un algoritmo teníamos hasta ahora dos estructuras condicionales:

  • if/else
  • switch

El única comando que se puede utilizar en todas las situaciones es el if/else, en algunas situaciones se puede remplazar por el switch y ahora veremos una tercer forma.

No se trata de una estructura condicional sino de un operador condicional, veremos que también se lo puede utilizar en algunos casos particulares y que tiene por objetivo escribir código más conciso.

La sintaxis del operador condicional:

[valor] = (condicion) ? valor1 : valor2

La condición del operador es igual a lo hacemos en un if clásico. Si el resultado de la condición se verifica verdadero luego el 'valor1' se almacena en [valor] y si la condición se verifica falsa el 'valor2' se almacena en [valor].

Por ejemplo si queremos almacenar en una variable si la persona es mayor de edad podemos hacerlo con la siguiente sintaxis:

        int edad = 3;
        String estado = edad >= 18 ? "Mayor" : "Menor";
        System.out.println(estado); // Menor

La variable estado almacena la cadena "Menor" debido a que la condición del operador se verifica falsa.

Como vemos es más concisa la codificación que plantearlo con un if/else:

        String estado;
        if (edad >= 18)
            estado = "Mayor";
        else
            estado = "Menor";
        System.out.println(estado); // Menor

Problema

Generar 10 valores aleatorios comprendidos entre 1 y 50. Mostrar cada uno de los valores y un mensaje indicando si tiene 1 o 2 dígitos.

Programa:

public class ValoresAleatorios {
    public static void main(String[] ar) {
        for (int f = 0; f < 10; f++) {
            int aleatorio = (int) (Math.random() * 50) + 1;
            System.out.println("El valor " + aleatorio + " tiene " + (aleatorio < 10 ? "1 dígito" : "2 dígitos"));
        }
    }
}

El resultado de ejecutar la aplicación es:

Operador condicional: (condicion)?valor1:valor2

El valor devuelto por el operador condicional se lo pasamos directamente al método 'println' para que lo muestre:

System.out.println("El valor "+aleatorio+" tiene " + (aleatorio < 10 ? "1 dígito" : "2 dígitos"));

Es obligatorio que todo el operador condicional se encuentre entre paréntesis para que se evalúe.

Problema

Mostrar los números del 1 al 100 e indicar si se trata de un número par o impar.

Programa:

public class ParesImpares {
    public static void main(String[] ar) {
        for (int f = 1; f <= 100; f++)
            System.out.println(f + " es " + (f % 2 == 0 ? "par" : "impar"));
    }
}

Problema

Codificar un programa que muestre en pantalla los números del 1 al 100, sustituyendo los múltiplos de 3 por el palabra "Fizz" y, a su vez, los múltiplos de 5 por "Buzz". Para los números que, al tiempo, son múltiplos de 3 y 5, mostrar el mensaje "FizzBuzz".

Este sencillo programa y otros similares se los ha utilizado para descartar candidatos que se presentan a un puesto de programador, si no lo puede resolver en unos pocos minutos significa que no tiene sentido entrevistarlo por temas profundos de programación por el que se esta buscando un candidato.

Programa:

public class FizzBuzz {
    public static void main(String[] ar) {
        for (int f = 1; f <= 100; f++)
            System.out.println(f % 3 == 0 && f % 5 == 0 ? "FizzBuzz" : (f % 3 == 0 ? "Fizz" : (f % 5 == 0 ? "Buzz" : f)));
    }
}
Operador condicional: (condicion)?valor1:valor2

El empleo del operador condicional debe hacerse con cuidado ya que hace menos legible el código.

Podemos ver que el programa es mucho más conciso que utilizar una serie de if anidados:

public class FizzBuzz {
    public static void main(String[] ar) {
        for (int f = 1; f <= 100; f++)
            if (f % 3 == 0 && f % 5 == 0)
                System.out.println("FizzBuzz");
            else 
                if (f % 3 == 0)
                    System.out.println("Fizz");
                else 
                    if (f % 5 == 0)
                        System.out.println("Buzz");
                    else
                        System.out.println(f);
    }
}

Problema propuesto

  1. Se tienen los siguientes vectores paralelos con las notas y nombres de alumnos:

            String[] alumnos = { "juan", "ana", "luis", "carla", "pedro", "laura", "maria" };
            int[] notas = { 3, 7, 10, 9, 2, 8, 5 };
    

    Generar otro vector paralelo con el String "libre" si la nota es menor a 4 y la cadena "regular" si la nota es mayor o igual a cuatro.

    Emplear el operador condicional para cargar el vector paralelo.

Solución
public class GenerarEstados {
    public static void main(String[] args) {
        String[] alumnos = { "juan", "ana", "luis", "carla", "pedro", "laura", "maria" };
        int[] notas = { 3, 7, 10, 9, 2, 8, 5 };
        String[] estados = new String[notas.length];
        for (int f = 0; f < notas.length; f++)
            estados[f] = notas[f] >= 4 ? "regular" : "libre";
        for (int f = 0; f < notas.length; f++)
            System.out.println(alumnos[f] + " tiene una nota " + notas[f] + " esta " + estados[f]);
    }
}

Retornar