77 votes

Utiliser un tableau comme une instruction case dans switch

Je suis en train de faire quelque chose comme ça, c'est-à-dire, utiliser un tableau dans une instruction switch. Est-ce possible en Java ? Si ce n’est pas, s’il vous plaît expliquer une solution possible.

74voto

Martijn Courteaux Points 33836

@sᴜʀᴇsʜ ᴀᴛᴛᴀ a raison. Mais je voulais ajouter quelque chose. Depuis Java 7, instructions switch prend en charge les chaînes, vous pourriez faire quelque chose avec ça. C’est vraiment sale et je ne recommande pas, mais cela fonctionne :


Pour ceux concernés sur les performances : vous avez raison, ce n’est pas super rapide. Cela sera compilée dans quelque chose comme ceci :

65voto

Non, simplement vous ne pouvez pas.

Le type de l’Expression doit être char, octets, court, int, caractère, Byte, Short, Integer, String ou un type enum (§8.9), ou une erreur de compilation se produit.

http://docs.Oracle.com/javase/specs/JLS/Se7/html/JLS-14.html#JLS-14.11

50voto

Bathsheba Points 23209

Vous ne pouvez pas activer des tableaux entiers. Mais vous pouvez convertir un bit défini aux dépens d’une certaine lisibilité du switch lui-même:

switch (values[0] + 2 * values[1] + 4 * values[2] + 8 * values[3])

et utilisez des littéraux binaires dans vos déclarations de cas: case 0b0101 est votre premier.

47voto

Alex Points 6180

Essayez cette solution:

     boolean[] values = new boolean[4];
    values[0] = true;
    values[1] = false;
    values[2] = false;
    values[3] = true;

    if (ArrayUtils.isEquals(values, new boolean[] {true, false, true, false})) {
    ...
    }
    else if (ArrayUtils.isEquals(values, new boolean[] {false, false, true, false})) {
    ...
    }
    else {
    ...
    }
 

Voir docs ici .

22voto

givanse Points 2421

Oui, vous pouvez passer un tableau à un commutateur. Le hic, c'est que je ne parle pas de Java, les tableaux, mais une structure de données.

Un tableau est un arrangement systématique des objets, généralement en lignes et en colonnes.

Ce que vous essayez de faire est de mettre en place un système qui reconnaît les différents drapeaux et selon les drapeaux qui sont activés ou désactivés vous prendre différentes actions.

Exemple

Populaire de la mise en œuvre de ce mécanisme est de permissions de fichiers sous Linux. Lorsque vous avez rwx comme le "tableau des indicateurs".

Si l'ensemble de la baie est vrai, vous verrez rwx, ce qui signifie que vous disposez de toutes les autorisations. Si vous n'êtes pas autorisé à effectuer une action sur un fichier, l'ensemble du tableau est faux, vous verrez ---.

La mise en œuvre

Devinez quoi, vous pouvez penser à des nombres entiers comme des tableaux. Un entier est représenté par un "tableau de bits".

001 // 1, if on, set x 
010 // 2, if on, set w 
100 // 4, if on, set r
// putting it all together in a single "array" (integer)
111 // 2^2 + 2^1 + 2^0 = 4 + 2 + 1 = 7

C'est pourquoi la permission rwx peut être représenté comme un 7

Java extrait:

class Flags {                                                                    
public static void main(String args[]) {         
        /** 
         * Note the notation "0b", for binary; I'm using it for emphasis.
         * You could just do: 
         * byte flags = 6;
         */                     
        byte flags = 0b110; // 6                     
        switch(flags) {                                                          
            case 0: /* do nothing */ break;                                      
            case 3: /* execute and write */ break;                       
            case 6: System.out.println("read and write\n"); break;         
            case 7: /* grant all permissions */ break;                           
            default:                                                             
                System.out.println("invalid flag\n");           
        }                                                                        
    }                                                                            
}

Pour en savoir plus sur l'utilisation d'un format binaire, cochez cette question: En Java, puis-je définir une constante entière en format binaire?

Performance

  • Économise de la mémoire
  • Vous n'avez pas besoin de traitement supplémentaire, les commutateurs ou tout autre type de jonglage.

C des programmes qui nécessitent d'être aussi efficace que possible l'utilisation de ce type de mécanisme; ils utilisent des drapeaux représentés avec une seule bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X