2010-11-07 7 views
4

J'essaie de résoudre un problème que j'ai sur mes devoirs.Vérifier la valeur sans structure de contrôle

Comment puis-je vérifier si une valeur est comprise dans une plage, par ex. 1 ≤ valeur ≤ 31, sans utiliser if, switch, ou toute autre structure de contrôle, en Java?

+0

wow, n'a pas utilisé mon compte officiel parce que j'ai demandé un de mes amis, mais il semble que vous aimiez vraiment cette question SO <3 – UserXY

+0

Désolé de tagging comme devoirs, puis en supprimant. Je n'ai pas eu l'avis que c'était trop méta! – Collin

+0

@Collin ça ne me dérange pas :) –

Répondre

9
// Zero if valid, non-zero otherwise 
int n = (int) Math.floor((value - 1)/31.0); 

// Convert any non-zero value to -1 (0xFFFFFFFF) without any boolean logic. 
n |= n << 1; n |= n >> 1;  
n |= n << 2; n |= n >> 2; 
n |= n << 4; n |= n >> 4; 
n |= n << 8; n |= n >> 8; 
n |= n << 16; n |= n >> 16; 

// Value is either -1 or 0. Switch -1 to +1. 
n = -n; 

// Use array indexing to simulate a conditional. 
String[] results = {"valid", "invalid"}; 
System.out.println(results[n]); 

Voir courir à http://ideone.com/98sA8.

Vous pouvez même étendre cette option pour exécuter différents chemins de code:

Runnable[] options = { 
    new Runnable() { 
     public void run() { 
      System.out.println("valid"); 
     } 
    }, 

    new Runnable() { 
     public void run() { 
      System.out.println("invalid"); 
     } 
    } 
}; 

options[n].run(); 

Voir courir à http://ideone.com/sUKiW.

+0

+1 Enfin! Arithmétique! :) J'essayais quelque chose de similaire moi-même. – pedrofurla

+0

Je pense que la logique booléenne n'était pas exclue. Seule la structure de contrôle fonctionne sur les booléens. – Bozho

+0

Nice. Les maths sont intéressants (surtout le flip à la fin), mais j'aime vraiment la façon dont cette réponse * montre l'utilisation d'une recherche * pour éviter une construction syntaxique de branchement - ceci peut être étendu à une recherche d'objet et la distribution de la méthode (par exemple, imaginez le tableau contenant les objets Runnable): 'Runnable [] results = ...; results [-n] .run() ' –

1

L'opérateur ternaire compte-t-il comme structure de contrôle? Il se comporte comme une déclaration if, mais il est utilisé comme un opérateur plutôt que d'une déclaration autonome:

System.out.println((1 <= value && value <= 31) ? "valid" : "invalid"); 
+1

Je pense que le?: Est une structure de contrôle déguisée. – gawi

+0

bien sûr, c'est juste une version courte de 'si x renvoie un autre retour b' –

3

Eh bien, techniquement cela n'utilise pas la structure de contrôle:

boolean isWithinRange = value >= 1 && value <= 31; 

mais si vous souhaitez utiliser la variable booléenne, vous auriez besoin d'une structure de contrôle. Il peut y avoir moyen d'utiliser une classe qui déclenche une exception lorsque certaines conditions ne sont pas remplies (par exemple un tampon de taille 31), puis d'intercepter l'exception, mais en interne, cette classe utilise également un contrôle. structure. Donc, ma réponse est - non, vous ne pouvez pas - vous aurez toujours besoin d'une structure de contrôle, même si elle est cachée dans l'implémentation d'une classe.

2

Une solution probablement stupide:

Arrays.asList("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").split(","). 
    contains(Integer.toString(value)); 
+1

' contains' a un 'if' à l'intérieur;) – Bozho

+2

Je parie que tout a un if * quelque part * à l'intérieur, que ce soit dans la VM elle-même .. . –

4

Vous pouvez définir le chèque à un booléen puis à imprimer cette booléen out:

boolean checkValue = (1 <= value && value <= 31); 
System.out.println(value); 
4

Vous pouvez utiliser les assertions de java pour la validation, mais si elle échoue, vous obtiendrez une AssertionError. Voir http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html.

+0

c'est un bon, +1 – Bozho

+0

bon? c'est original mais aussi horrible ... –

+0

@seanizer - étant donné la question, rien de non-terrible ne peut être fourni. Et celui-ci fonctionnerait. – Bozho

7
(value-1)-((value-1+31)%31) 

0 signifie vrai, rien d'autre signifie faux.

1

Ce que vous pouvez faire est d'envoyer la valeur à un serveur en utilisant des sockets. Ensuite, demandez à une vraie personne de vérifier la condition et laissez-la vous renvoyer la réponse (vrai, faux).

Vous pouvez utiliser un ObjectInputStream pour recevoir la réponse en tant qu'objet booléen car un objet booléen implémente Serializable, vous pouvez éviter l'utilisation de if. Jetez simplement l'objet reçu dans votre variable booléenne.

Questions connexes