2013-03-05 15 views
8

Sto cercando un modo per gestire due stringhe usando un solo interruttore, penso che sia impossibile in Java.Istruzione switch Java per gestire due variabili?

Ecco alcuni pseudo-codice del tipo di cosa che voglio ottenere solo con un interruttore.

int s1Value = 0; 
    int s2Value = 0; 
    String s1 = "a"; 
    String s2 = "g"; 
    switch (s1 || s2) { 
     case "a": s1value = 0; s2value = 0; break; 
     case "b": s1value = 1; s2value = 1; break; 
     case "c": s1value = 2; s2value = 2; break; 
     case "d": s1value = 3; s2value = 3; break; 
     case "e": s1value = 4; s2value = 4; break; 
     case "f": s1value = 5; s2value = 5; break; 
     case "g": s1value = 6; s2value = 6; break; 
    } 
+0

's1' e' s2' non sono 'String'! – Apurv

+0

Penso che tu non capisca [Switch sintassi] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html) .. – christopher

+0

Ho copiato e incollato la parte sbagliata :) Modificato. .. – Ciphor

risposta

1

Si può fare ciò che si vuole senza utilizzare un interruttore, semplicemente scrivendo che:

s1value = s1.charAt(0)-'a'; //returns 0 if s1value="a", 1 if s1value="b", etc. 

quello che non capisco è del tutto che cosa si intende con

(s1 || s2) 

Vuoi fare qualcosa del genere?

int s1Value = 0; 
    int s2Value = 0; 

    String s1 = "g"; 
    String s2 = "a"; 

    char s1char = s1.charAt(0); 
    char s2char = s2.charAt(0); 
    int myChar = Math.max(s1char, s2char); 
    s1Value = s2Value = myChar - 'a'; 

UPDATE

Nei commenti, hai scritto:

s1 = "g" e s2 = "g" prima di entrare l'interruttore, allora l'unico caso che valuterà a true è il caso "g" e quindi sia s1Value che s2Value diventeranno 6 e quindi escono dallo switch.

così, penso che stai dicendo che S1 e S2 vengono inizializzati con lo stesso valore, in modo da:

int s1Value = 0; 
    int s2Value = 0; 

    String s1 = "g"; 
    String s2 = "g"; 

    char s1char = s1.charAt(0); 
    s1Value = s2Value = s1char - 'a'; //s1Value = s2Value = 6 

Questo dovrebbe fare quello che vuoi

UPDATE 2

con s1 = "a" e s2 = "d" consideriamo il caso "a", con s1 = "c" e s2 = "b" consideriamo il caso "b"

Prova questa:

int s1Value = 0; 
    int s2Value = 0; 

    String s1 = "g"; 
    String s2 = "a"; 

    char s1char = s1.charAt(0); 
    char s2char = s2.charAt(0); 
    int myChar = Math.min(s1char, s2char); 
    s1Value = s2Value = myChar - 'a'; 

Si dovrebbe fare il trucco, testarlo e fammi sapere se funziona

+0

No niente a che fare con il passaggio attraverso il String, voglio semplicemente verificare in ogni caso se s1 OR s2 sia vero e quindi eseguire alcune istruzioni se lo è. – Ciphor

+0

s1 e s2 non possono essere veri o falsi, ** poiché sono stringhe e non booleani **, quindi in pratica non è possibile verificare se una stringa è vera o falsa. Dimmi, quando dovrebbe essere vera la tua stringa e quando dovrebbe essere falsa? – BackSlash

+0

Il caso "g" è come dire se (s1.equals ("g") || s2.equals ("g")) nel mio pseudo. – Ciphor

8

utilizzando un unico interruttore secondo il vostro requisito non è possibile. Questo è il più vicino possibile per ottenere l'utilizzo di Java.

switch (s1) { 
     case "a": doAC(); break; 
     case "b": doBD(); break; 
     default: 
      switch(s2) { 
       case "c": doAC(); break; 
       case "d": doBD(); break; 
      } 
    }   
+0

Vedi quello che stavo evitando, come posso anche solo avere due interruttori separati, uno per ogni stringa:/ – Ciphor

+0

Due interruttori separati possono causare errori nel codice perché doAC() o doBD() verrà chiamato due volte.È necessario utilizzare gli switch annidati come indicato: – Java42

+0

Se non lo è possibile come dici tu, dovrò solo sognare il giorno in cui posso usare un'espressione booleana come l'istruzione switch :) – Ciphor

4

L'unico modo per farlo con un singolo interruttore è di fondere prima i due valori, trovando quello con la più alta precedenza, e applicando l'interruttore al risultato. Nel tuo esempio, il minimo di s1 e s2 e accensione del risultato.

Poiché "a" a "g" sono un esempio, è necessario disporre di un modo significativo per classificare per primi i valori reali.

4

Hai considerato di non utilizzare l'istruzione ma invece di utilizzare le tabelle di ricerca?

public class MyClass { 
    private static final Map<String, Integer> valuesMap; 

    static { 
     Map<String,Integer> aMap = new HashMap<>(); 
     aMap.put("a", 0); 
     aMap.put("b", 1); 
       ..... rest ..... 
     valuesMap = Collections.unmodifiableMap(aMap); 
    } 

    public void foo() 
    { 
     int s1Value = 0; 
     int s2Value = 0; 

     String s1 = "a"; 
     String s2 = "g"; 
     if(valuesMap.containsKey(s1)) 
     { 
      s1Value = valuesMap.get(s1); 
      s2Value = s1Value; 
     } 
     else if(valuesMap.contansKey(s2)) 
     { 
      s1Value = valuesMap(s2); 
      s2Value = s1Value; 
     } 
    } 
} 

Se avete bisogno di un diverso insieme di valori del s2Value allora si potrebbe costruire una seconda mappa per tirare quelli.

Dal momento che si voleva utilizzare un interruttoreLo prendo per significare i possibili candidati e dei valori è un fisso, conosciuto in elenco i tempi di sviluppo, in modo da utilizzare una mappa inizializzata staticamente come questo non dovrebbe essere un problema.

Problemi correlati