2016-03-21 10 views
1

Ich versuche zu lesen von System.in. Der Eingang ist in diesem Typ: Die erste Zahl ist die Anzahl der Testfälle, dann im Integer dann einige Zeilen.Scanner stoppen, wenn es keine Zeilen mehr zu lesen gibt

2 

10 
c 1 5 
c 2 7 
q 7 1 

1 
q 1 1 
c 1 1 
q 1 1 

Das Problem ist, dass während Schleife nicht beendet, wenn ich den letzten Test beenden, trotz dass es sc.hasNext() Bedingung in der Schleife ist.

public static void main(String[] args){ 

    Scanner sc = new Scanner(System.in); 

    int testCases = sc.nextInt(); 

    for(int i=0;i<testCases; i++){ 
     int numberOfQuestions = 0; 
     int numberOfSuccessufulQuestions = 0; 
     int computerNumber = sc.nextInt(); 
     Graph g = new Graph(); 

     while(!sc.hasNextInt() && sc.hasNext()){ 
      String type = sc.next(); 
      if (type.trim().equals("\n")) 
       break; 
      if(type.equals("c")){ 
       int a = sc.nextInt(); 
       int b = sc.nextInt(); 
       g.setEdge(a, b); 
      }else if(type.equals("q")){ 
       visited = new HashMap<>(); 
       int a = sc.nextInt(); 
       int b = sc.nextInt(); 
       numberOfQuestions++; 
       if(a == b){ 
        numberOfSuccessufulQuestions++; 
       } 
       else if(g.isNodeExist(a) && g.isNodeExist(b)){ 
        if(connected(g, a, b)){ 
         numberOfSuccessufulQuestions++; 
        } 
       } 
      } 
     } 

     System.out.println(numberOfSuccessufulQuestions+ ","+ (numberOfQuestions - numberOfSuccessufulQuestions)); 
    } 
} 
+0

Graph ist abstrakt kippt instanziert werden. – ferit

+0

'if (type.trim(). Equals (" \ n ")) break;' sollte 'continue;' stattdessen verwenden. Andernfalls endet der Testfall nach der ersten Zeile. – 4castle

+0

'hasNext()' wird nicht falsch sein, wenn Sie den Stream nicht beenden. Es gibt immer die gleiche Frage zum Stoppen des Scanners auf "System.in". – Tom

Antwort

0

Scanner ist in Ordnung, da es so aussieht, als ob Sie Ad-hoc-Informationen eingeben möchten.

Das Problem ist, dass sc.next() nicht durch einen einfachen Tastendruck in der Konsole ausgelöst wird.

Die Lösung sehe ich hier, um die Schleife mit einem Befehl zu beenden.

Statt if (type.trim().equals("\n")) Verwendung so etwas wie (type.trim().equals("exit"))

+0

Ich kann das Eingabeformat nicht ändern, ich muss Daten daraus extrahieren, ohne die Eingabe zu ändern. – thechef

+0

In diesem Fall ist es besser, eine Datei zu verwenden. – Thihara

Verwandte Themen