2017-02-28 3 views
-1

Ich mache ein Projekt für die Schule und meine Aufgabe besteht darin, ein LinkedList-Programm zu erstellen, das ein Benutzer in eine Zeile von Ints lesen und die Linked List-Funktionen verwenden kann, um sie umgekehrt zu drucken. Ich habe es etwas funktioniert, aber jedes Mal muss ich das Einlesen von System.in durch Drücken von Strg + C beenden. Jeder ... Zeit ...Umgekehrte Liste Problem

Ich versuche, einen Weg zu finden, den Scanner zu stoppen, lesen, wenn es den Int -1 liest. Whitespace ist auch okay. Aber sobald es -1 liest, möchte ich es stoppen Aber ich kann den richtigen Weg nicht finden. Hier

ist das, was ich bisher:

//ReverseUsingLinkedList.java 
import java.util.*; 
public class ReverseUsingLinkedList 
{ 
    public static void main(String[]args) 
    { 
     System.out.print("Enter a sequence of Integers, -1 to end: "); 

     LinkedList<Integer> num= new LinkedList<Integer>(); 
     Scanner keyboard = new Scanner(System.in); 

     while(keyboard.hasNext()) 
     { 
      num.addFirst(keyboard.nextInt()); 
     } 
     keyboard.close(); 
     num.removeFirst();  //Removes the -1 from the LinkedList 

     System.out.println("List in reverse :" + num.toString()); 

    } 
} 

Ich habe versucht, die Änderung der in hasNext.Int lesen() statt, aber das bewirken, dass die Lese über springen alle anderen int, die ich zu lesen versuchte. Ich habe auch versucht, einen Iterator zu verwenden, aber ich konnte nicht den richtigen Weg finden, ihn zu benutzen.

Irgendwelche Vorschläge? wenn ja

while(keyboard.hasNext()) 
    int num = keyboard.nextInt(); 
    if (num == -1) // or less than 0 ? 
    break;  
    num.addFirst(num); 
} 

bearbeiten

Bitte beachten Sie @nullpointer sehr gültig Kommentar

+0

* Ich muss das Einlesen von System.in beenden, indem Sie Strg + C * drücken - wie erwartet der Scanner sonst, dass es keine Eingaben mehr von System.in gibt? - vielleicht "Pause", wenn nicht ein Int? –

+0

In diesem Fall ist der Leerraum aber auch okay, ich versuche einen Weg zu finden, der den Scanner stoppt, wenn er -1 liest. Es kann jedoch nicht den richtigen Weg finden, dies zu tun. –

Antwort

0

zu testen, ob Eingang -1 und zu brechen ist Holen Sie sich das Benutzereingabe als int. umschließen Sie es in einem Versuch Catch Block. In Ausnahmefällen können Sie brechen.

try{ 
    int x =keyboard.nextInt(); 
    if(x==-1) 
     break; 
catch(Exception e){ 
    break; 
} 
num.addFirst(i); 
+0

Ich weiß nicht, warum ich nicht daran gedacht habe, es einfach so zu initialisieren. Vielen Dank. Das hat sehr geholfen! –

+0

@Scary Wombat - dies stellt auch sicher, dass -1 jetzt nicht zur Liste hinzugefügt wird und nicht wie in der Frage entfernt werden sollte. Plus die alternativen Eingaben zur Liste. – nullpointer

0

1

Um jede Art von Lesern zu verwenden, müssen Sie durch den Leser zu durchlaufen zunächst die Anzahl von Objekten zu erfassen und dann ein zweites Mal durchlaufen die tatsächlichen Werte zu verwenden. Versuchen Sie Folgendes:

int len = 0; 

while(keyboard.hasNext()) 
{ 
    len++; 
} 
keyboard.close(); 

for (int i = 0; i < len; i++) 
{ 
    int temp = keyboard.nextInt(); 
    if (temp == -1) 
     break; 
} 

Sobald Sie aus dem for Schleife brechen, können Sie wählen, ob Sie das -1 Element entfernen möchten. Die O{n} wird die gleiche sein, außer jetzt wird es nicht zu jedem int-Wert statt jeder anderen springen.

Zusätzlich empfehle ich Ihnen, java.io.BufferedReader über java.util.Scanner zu versuchen. Es funktioniert nur, wenn Sie jedes int in einer separaten Zeile haben, aber die Geschwindigkeit ist über 10 mal schneller.

0

Obwohl die Antwort von @Scary hilft, um den richtigen Zustand zu überprüfen. Ich würde vorschlagen, die Umsetzung der Aktualisierung die nächste Eingabe zu lesen wie folgt und vermeiden Sie die Eingabe in der Liste im Wechsel -

int input = keyboard.nextInt(); // the first input 
while (input !=-1) { // you do not jump with a hasNext() call now 
    num.addFirst(input); 
    input = keyboard.nextInt(); // successive input 
} 
// get rid of removeFirst() call 

Mit dem obigen Ansatz des Input-Output sein wie -

Enter a sequence of Integers, -1 to end: 3 
4 
5 
6 
-1 
List in reverse :[6, 5, 4, 3] 

Mit Ihrem aktuellen Update und Scary Vorschlag Sie mig ht immer noch n-Eingang 2, 4, 6, 7, -1 nur um den Ausgang 7, 4 zu finden, die nicht gewünscht zu sein scheint.