2016-07-12 9 views
0

Die Variable "varOptions" wird über Scanner erreicht. Grundsätzlich möchte ich: [A, B, C, D, E, F] werden: [0, 1, 2, 3, 4, 5]. Es ist auch sehr wichtig, dass der Code keine Groß- und Kleinschreibung berücksichtigt. Derzeit ist dieser Code ziemlich umfangreich. Ich frage mich, ob es einen Weg gibt, dies effizienter zu machen?Effizientere Vorgehensweise if/else Verzweigen mit Variablenzuweisung in Java

if ("A".equalsIgnoreCase(varOptions)) { 
     int varOpt = 0; 
    } else if ("B".equalsIgnoreCase(varOptions)) { 
     int varOpt = 1; 
    } else if ("C".equalsIgnoreCase(varOptions)) { 
     int varOpt = 2; 
    } else if ("D".equalsIgnoreCase(varOptions)) { 
     int varOpt = 3; 
    } else if ("E".equalsIgnoreCase(varOptions)) { 
     int varOpt = 4; 
    } else if ("F".equalsIgnoreCase(varOptions)) { 
     int varOpt = 5; 
    } 
+1

Map-Lookup der offensichtliche Weg ist. – John3136

+1

Ist dies nur für diese spezifischen Werte? Was passiert mit "G"? Außerdem klingt das nach einer Frage, die für Code Review besser geeignet ist als SO. – chrylis

+1

Haben Sie ein Effizienzproblem, das Sie lösen möchten? – Amit

Antwort

0

Konvertieren Sie die Variable varOptions in ein Zeichen, wenn dies nicht bereits der Fall ist (im Gegensatz zu einer Zeichenfolge). Sobald es ein Zeichen ist, können Sie es in eine Ganzzahl umwandeln, die das Zeichen in seinen ASCII-Code konvertiert. Das Zeichen 'A' hat einen ASCII-Code von 65. B ist 66. C ist 67 usw.

Um Groß-/Kleinschreibung zu vermeiden, konvertieren Sie das Zeichen vor der Konvertierung in eine ganze Zahl in Großbuchstaben.

Daher, nachdem es auf eine ganze Zahl Gießen, subtrahieren Sie nur 65, und Sie werden eine Zahl zwischen 0 und 5 haben:

int varOpt = (int)Character.toUppercase(varOptions); 
varOpt -= 65; 

Der obige Code angenommen varOptions bereits vom Typ char ist. Beachten Sie, dass der Fall zu einem Int nicht erforderlich ist, aber die Lesbarkeit verbessert. Man könnte genauso gut tun:

int varOpt = Character.toUppercase(varOptions); 

Vollcodebeispiel ist unter der Annahme, varOptions ein String:

char varOptChar = varOptions.charAt(0); // grab first character 
int varOpt = (int)Character.toUppercase(varOptChar); 
varOpt = varOpt - 65; 

varOpt sollte nun zwischen 0 und 5 für Ihr Beispiel. Um dies zu verstehen, müssen Sie verstehen, dass Zeichen Dezimalstellen in einem Computer haben. Der Computer sieht nur die Nummer 65, weiß aber, dass diese Zahl ein Großbuchstabe A angibt. 65 heißt ein ASCII-Code; Sie können eine Tabelle von ASCII-Codes finden Sie hier: http://www.asciitable.com/

+0

Können Sie mir ein Codebeispiel von dem geben, was Sie sagen? Es tut uns leid. Ich bin mit der Java-Syntax nicht sehr vertraut. –

+0

@ JonathanMousley Hinzugefügt!Der Code selbst ist nicht komplex, aber wenn Sie mit ASCII-Codes nicht vertraut sind, kann ich sehen, wie das verwirrend sein könnte. Ich habe versucht, eine kleine Erklärung hinzuzufügen. –

+0

Ok. Das funktioniert perfekt. Vielen Dank! –

-1

Es ist nicht so schön, aber man könnte so etwas wie dieses

Map<String, Integer> map = new HashMap<String, Integer>() 
{{ 
    put("A", 1); 
    put("B", 2); 
    put("C", 3); 
    put("D", 4); 
    put("E", 5); 
    put("F", 6); 
}}; 

// varOpt will be null if it is not in the map 
int varOpt = map.get(varOptions.toUpperCase()); 
+0

Einverstanden, ich habe nur eine Alternative gezeigt. – user1875195

+1

Ich habe nie diese doppelte geschweifte Klammernnotation gesehen. Erstellt das eine anonyme Unterklasse von HashMap, die einen zusätzlichen statischen Initialisierer hat? – Teto

+0

@Teto Yup. Es ist auch aus mehreren Gründen nicht empfehlenswert - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ https: // blog. nishtahir.com/2015/09/27/why-you-shouldnt-use-the-double-brace-initializer/ http://stackoverflow.com/questions/1958636/what-is-double-brace-initialization-in- Java http://StackOverflow.com/Questions/924285/Efficiency-of-JavaDoubleBrace-Initialization - * "Jedes Mal, wenn Sie DBI verwenden, wird ein Kätzchen getötet" * – vaxquis

0
int varOpt = Character.toUppercase(varOptions.charAt(0)) - 'A'; // assuming varOptions is String 

oder

int varOpt = Character.toUppercase(varOptions) - 'A'; // assuming varOptions is char 

Sie auch switch tun können auf String:

int varOpt; 
switch(varOptions.toUpperCase()) { 
    case "A": 
     varOpt = 0; break; 
    case "B": 
     varOpt = 1; break; 
    // etc 
} 

oder verwenden Sie eine Map, wenn Sie beabsichtigen, etwas anderes als einfaches char-to-int-Mapping über einen kontinuierlichen Bereich durchzuführen.

0

Wie sei:

int varOpt = " ABCDEF".indexOf(varOptions.toUpperCase()); 
-1

Eine Alternative ist, den Brief als hexadezimale Zahl zu analysieren und subtrahieren 11:

int varOpt = Integer.parseInt(varOptions, 16) - 0xA;