web-dev-qa-db-fra.com

Conditions multiples chez les opérateurs ternaires

Tout d’abord, la question est la suivante: «Rédigez un programme Java pour trouver le plus petit des trois nombres à l’aide d’opérateurs ternaires».

Voici mon 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.");
    }
}

J'ai essayé d'utiliser plusieurs conditions dans l'opérateur ternaire, mais cela ne fonctionne pas. J'étais absent quelques jours, alors je ne sais pas trop quoi faire et le téléphone de mon professeur est éteint. De l'aide?

16
Mike

Essayer

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

Vous pouvez également supprimer la parenthèse:

int min = x < y ? x < z ? x : z : y < z ? y : z;
25
Markus Johnsson

Comme il s’agit d’un devoir, je ne vais pas seulement vous donner la réponse, mais plutôt un algorithme pour que vous puissiez le résoudre vous-même.

Commencez par comprendre comment écrire min (x, y) en utilisant un seul opérateur ternaire.

Une fois que vous avez cela, modifiez le code suivant pour min (x, y, z) pour utiliser un opérateur ternaire, puis remplacez-le par le code que vous avez défini à l’étape précédente.

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

Vous testez z, alors que vous n'en avez vraiment pas besoin. Votre opérateur ternaire doit être de forme cond? ifTrue: ifFalse;

donc si vous avez plusieurs conditions, vous avez ceci:

cond1? ifTrue1: cond2? si True2: ifFalse2;

Si vous comprenez cela, ne regardez pas ci-dessous. Si vous avez encore besoin d'aide, regardez ci-dessous.

J'ai également inclus une version qui ne les imbrique pas qui est plus claire (en supposant que vous n'avez pas besoin de les imbriquer. J'espère bien que votre mission ne vous oblige pas à les imbriquer car c'est assez moche!)

.

.

Voici ce que je viens avec:

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.");
    }
}
4
corsiKa
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);
}
2
smas

Je sais qu'il est tard. Juste pour information, cela fonctionne aussi:

int smallestNum = (x<y ? x : (x=y)) < z ? x : z
2
Marek

Ma contribution ... 

public static int getSmallestNumber( int x, int y, int z) {

     return x < y && x < z ? x : y < x && y < z ? y : z;
}

public static void main ( String ... args ) {

    System.out.println( getSmallestNumber( 123, 234, 345 ) );
}
1
Eddie B

La dernière partie: (z<y && z<x) ? z manque un ':':

(z<y && z<x) ? z : some_value;
1
extraneon

Ma solution:

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

Cette réponse arrive avec sept ans de retard, je vais donc vous donner le code:

int smallestNumber = (x > y) ? 
            ((y > z) ? z : y) : 
            ((x > z) ? z : x);

L'indentation doit expliquer le code, qui est simplement un ternaire qui évalue les autres ternaires sur la condition initiale x > y;/* le premier ternaire est évalué si cette condition est vraie, sinon le second est évalué. * /

0
Mike Warren