Multiple conditions in ternary operators

104,259

Solution 1

Try

int min = x < y ? (x < z ? x : z) : (y < z ? y : z);

You can also remove the parenthesis:

int min = x < y ? x < z ? x : z : y < z ? y : z;

Solution 2

Since this is homework I'm not just going to give you the answer, but instead an algorithm so that you can work it out yourself.

First work out how to write min(x, y) using a single ternary operator.

Once you have that, change the following code for min(x, y, z) to use a ternary operator then substitute in the code for min(x, y) that you worked out from the previous step.

int min(x, y, z) {
    if (x <= y) {
        return min(x, z);
    } else {
        return min(y, z);
    }
}

Solution 3

You're testing for z, when you really don't need to. Your ternary operator must be of form cond ? ifTrue : ifFalse;

so if you have multiple conditions, you have this:

cond1? ifTrue1 : cond2? if True2 : ifFalse2;

If you understand this, don't look below. If you still need help, look below.

I also included a version that doesn't nest them that is clearer (assuming you don't need to have them nested. I sure would hope your assignment doesn't require you to nest them because that's pretty ugly!)

.

.

Here's what I come up with:

class QuestionNine
{
    public static void main(String args[])
    {
        smallest(1,2,3);
        smallest(4,3,2);
        smallest(1,1,1);
        smallest(5,4,5);
        smallest(0,0,1);
    }

    public static void smallest(int x, int y, int z) {
        // bugfix, thanks Mark! 
        //int smallestNum = (x<y && x<z) ? x : (y<x && y<z) ? y :  z;
        int smallestNum = (x<=y && x<=z) ? x : (y<=x && y<=z) ? y :  z;
        System.out.println(smallestNum + " is the smallest of the three numbers.");
    }

    public static void smallest2(int x, int y, int z) {
       int smallest = x < y ? x : y; // if they are equal, it doesn't matter which
       smallest = z < smallest ? z : smallest;
       System.out.println(smallest + " is the smallest of the three numbers.");
    }
}

Solution 4

public static int min(int x, int y, int z) {
    return x<y?Math.min(x, z):Math.min(y, z);           
}

public static void main(String[] args) {
    int smallestNum = min(10, 12, 15);
    System.out.println(smallestNum);
}

Solution 5

I know it's late. Just for information this also works:

int smallestNum = (x<y ? x : (x=y)) < z ? x : z
Share:
104,259
Admin
Author by

Admin

Updated on February 02, 2022

Comments

  • Admin
    Admin about 2 years

    First off, the question is "Write a Java program to find the smallest of three numbers using ternary operators."

    Here's my code:

    class questionNine
    {
        public static void main(String args[])
        {
            int x = 1, y = 2, z = 3;
            int smallestNum;
    
            smallestNum = (x<y && x<z) ? x : (y<x && y<z) ? y : (z<y && z<x) ? z;
            System.out.println(smallestNum + " is the smallest of the three numbers.");
        }
    }
    

    I tried to use multiple conditions in the ternary operator but that doesn't work. I was absent a few days so I'm not really sure what to do and my teacher's phone is off. Any help?

  • Jakub Zaverka
    Jakub Zaverka about 12 years
    Parentheses-free version looks like an entry to Obfuscated-C competition.
  • The Hungry Dictator
    The Hungry Dictator about 10 years
    Please add some more details in your answer
  • loadedion
    loadedion almost 9 years
    I like this implementation. Let the libraries do the work
  • sofs1
    sofs1 over 7 years
    Why does adding extra paranthesis gives error: unexpected type int min = x < y ? ((x < z) ? x : z) : ((y < z) ? y : z);
  • Mike Warren
    Mike Warren about 6 years
    It's mutating the data, though, but I can see this working
  • fthdgn
    fthdgn about 6 years
    Returns 2 when it is called with parameters (3,2,1)
  • Edward J Beckett
    Edward J Beckett about 6 years
    @fthdgn ~ Good Catch... Fixed.