2009-09-17 10 views
1

est-il un moyen simple de le faireJava: Condition mathématique

if (1 < x && x < 3) { .... } 

Je veux quelque chose comme ceci:

if (1 < x < 3) { .... } 

Je sais que le code ci-dessus est erroné, mais ....

Merci

+6

Python vs Java: 1-0 –

+1

Il ne vaut pas la peine de rendre la syntaxe plus compliquée pour cela, il suffit de s'en remettre. – starblue

Répondre

6

Malheureusement, vous ne pouvez pas le faire en Java. Vous pouvez toutefois créer une classe, par exemple MathUtils, avec une méthode isBetween, comme ceci:

public static boolean isBetween(int n, int begin, int end) { 
    return n > begin && n < end; 
} 

Ensuite, vous pouvez utiliser (en supposant import static):

if (isBetween(x, 1, 3)) { 
    // ... 
} 

Mais ce serait seulement utile si vous avez de nombreuses conditions plage.

1

Cette déclaration en utilisant && est la plus simple que vous pouvez obtenir. Java, ni aucun autre langage de style C que je connais, a un support pour les inégalités chaînées.

3

Ne pas utiliser les langues intégrées; tu devrais aller avec ta première réponse.

Plusieurs bibliothèques vous permettra de faire quelque chose comme ce qui suit:

Range range = new ExclusiveRange(1,3); 
if (range.contains(x)) { ... } 
+0

... ce qui n'est guère important en termes de lisibilité. – Noldorin

+0

(ou l'efficacité, d'ailleurs) – Noldorin

+0

Vrai sur les deux chefs d'accusation. :-) Pour la situation simple que l'OP présentait, il vaudrait certainement mieux aller avec la paire de comparaisons natives. Mais dans des situations plus complexes, le fait de pouvoir faire passer un objet Range au lieu d'une paire d'ints peut en fait être plus clair et plus lisible (imaginez en ajoutant une option à une signature de méthode qui prend déjà 6 paramètres int)). –

3

En termes d'efficacité, (1 < x && x < 3) est aussi bon que vous obtiendrez. Pour mettre un nombre entier dans une plage, vous devez effectuer deux comparaisons.

Si vous voulez rendre votre code plus lisible et que vous avez beaucoup de ces plages, vous pouvez envisager de créer une classe Interval avec une fonction contains().

3

Vous avez la forme la plus simple en termes de syntaxe Java directe. Vous pouvez introduire une méthode si vous voulez:

public static boolean isBetween(int x, int min, int max) { 
    return min < x && x < max; 
} 

puis appelez avec:

if (isBetween(x, 1, 3)) 

mais je ne pense pas que ce soit vraiment plus clair - et cela signifie qu'il ya plus de possibilité de mettre les arguments le mauvais ordre. La classe Range suggéré dans une autre réponse allégerait cette préoccupation, mais au prix d'ajouter encore plus fouillis ...

6

En supposant que vous parlez des entiers:

if (x == 2) { .... } 

Il y a un certain nombre petits morceaux de Java qui viennent de lui être un meilleur C++ - en C ou C++, il y a une conversion automatique entre les valeurs booléennes et entiers, donc en C++:

int x = 5; 

std::cout << std::boolalpha; 

std::cout << (1 < x < 3) << std::endl; 
std::cout << ((1 < x) < 3) << std::endl; 

w imprimez deux fois "vrai", car (1 < x) évalue que 1 et 1 est inférieur à 3.Java se concentre sur la résolution de cette ambiguïté en analysant deux opérateurs binaires en rendant les types booléens et entiers non convertibles, de sorte que vous devez les joindre avec un autre opérateur; Les autres langages n'essayent pas de réparer C++ mais ont des règles d'analyse plus compliquées, de sorte que _ < _ < _ est un opérateur ternaire qui fait ce qu'il faut.

Questions connexes