2009-04-02 3 views
0

Ich versuche, Eingaben vom Terminal zu lesen. Dafür benutze ich einen BufferedReader. Hier ist mein Code.Eingabe der Eingabefehler in Java

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
String[] args; 
do { 
    System.out.println(stateManager.currentState().toString()); 
    System.out.print("> "); 
    args = reader.readLine().split(" "); 
    // user inputs "Hello World" 
} while (args[0].equals("")); 

Irgendwo anders in meinem Code habe ich eine HashTable wo der Schlüssel und Werte sind beide Strings. Hier ist das Problem:

Wenn ich einen Wert von der HashTable erhalten möchte, wo der Schlüssel, den ich verwende, um in der HashTable nachschlagen ist eines der Argumente Elemente. Diese Argumente sind komisch. Wenn der Benutzer zwei Argumente eingibt (das erste ist ein Befehl, das zweite ist das, was der Benutzer nachschlagen möchte), kann ich keine Übereinstimmung finden.

Zum Beispiel, wenn der HashTable enthält die folgenden Werte:

[ {"Hello":"World"}, {"One":"1"}, {"Two":"2"} ] 

und der Benutzer gibt:

get Hello 

Mein Code nicht zurück "World".

Also habe ich den Debugger (mit Eclipse) verwendet, um zu sehen, was in args ist. Ich fand, dass args[1] enthält "Hello" aber innerhalb args[1] gibt es ein Feld mit dem Namen value, die den Wert ['g','e','t',' ','H','e','l','l','o'] hat.

Das gleiche gilt für args[0]. Es enthält "get", aber das Feld value enthält ['g','e','t',' ','H','e','l','l','o']!

Was zum Teufel !!!

Allerdings, wenn ich meine HashTable, wo immer der Schlüssel ist "Hello", der Wert = ['H','e','l','l','o'].

Irgendwelche Ideen?

Vielen Dank.


EDIT:

Ist hier kommen Codebeispiel. Das Gleiche passiert immer noch.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Hashtable; 

public class InputTest 
{ 
    public static void main(String[] args) 
    { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(  System.in)); 
     Hashtable<String, String> EngToSpa = new Hashtable<String, String>(); 

    // Adding some elements to the Eng-Spa dictionary 
    EngToSpa.put("Hello", "Hola"); 
    EngToSpa.put("Science", "Ciencia"); 
    EngToSpa.put("Red", "Rojo"); 

    // Reads input. We are interested in everything after the first argument 
    do 
    { 
     System.out.print("> "); 
     try 
     { 
      args = reader.readLine().trim().split("\\s"); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } while (args[0].equals("") || args.length < 2); 
    //^We don't want empty input or less than 2 args. 

    // Lets go get something in the dictionary 

    System.out.println("Testing arguments"); 

    if (!EngToSpa.contains(args[1])) 
     System.out.println("Word not found!"); 
    else 
     System.out.println(EngToSpa.get(args[1])); 

    // Now we are testing the word "Hello" directly 
    System.out.println("Testing 'Hello'"); 

    if (!EngToSpa.contains("Hello")) 
     System.out.println("Word not found!"); 
    else 
     System.out.println(EngToSpa.get("Hello")); 

} 
} 

Das gleiche passiert immer noch. Ich muss Hash-Tabellen falsch verstehen. Ideen, wo etwas schief läuft?

+0

Da Ihr Problem darin besteht, Einträge in eine Hash-Tabelle einzugeben und abzurufen, geben Sie diesen Code ein. Die Relevanz des Codes ist nicht klar. – erickson

Antwort

1

Ich habe gerade meinen Fehler bemerkt. Ich muss verwenden containsKey() anstelle von enthält().

Ich möchte allen danken für ihre Hilfe.

Als Bonus habe ich auch gelernt, was das Feld "Wert" ist. Nett!

1

Mach dir keine Sorgen über das Wertfeld - das heißt nur, dass es ein Char-Array gibt, das den Text "Hallo holen" enthält, und sowohl Args [0] als auch Args [1] beziehen sich auf dieses char-Array, aber sie werden unterschiedliche Offsets und Zählungen haben. args [0] hat einen Offset von 0 und eine Anzahl von 3; args [1] haben einen Offset von 4 und eine Anzahl von 5.

Ich habe keine Ahnung, warum Ihre Hash-Karte nicht funktionieren würde ... können Sie ein kurzes, aber vollständiges Beispielprogramm bereitstellen?

0

Wie Jon sagte, sehen Sie gerade ein Artefakt der internen Implementierung von String s in Java. Sie können das Feld value für Ihre Zwecke ignorieren. Das hat nichts damit zu tun, warum die Dinge nicht für dich arbeiten.Sie müssen uns den Teil des Codes zeigen, der nicht funktioniert.