ubuntuusers.de

Java: String [] per Scanner aufüllen

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

knacht

Anmeldungsdatum:
16. Mai 2010

Beiträge: 17

Hi,

ich mache gerade eine Übungsaufgabe für die Schule und hab hier einen kleinen Fehler den ich ums verrecken nicht erkenne. Per Bubblsort soll ein String Array Lexiographisch sortiert werden. Sobald ich die Grösse direkt angebe funktioniert auch alles bestens.

   
        String[] names = new String[3];
        boolean unsorted = true;
        String temp;

        for (int i = 0; i < names.length; i++) {
            System.out.println("Bitte geben sie den " + (i+1) + " Namen ein");
            names[i] = sc.nextLine();
        }

3 Elemente werden eingelesen, so wie es sein soll. Wenn ich allerdings folgendes Probiere

      int elements = sc.nextInt();
      String[] names = new String[elements];
        
        boolean unsorted = true;
        String temp;

  for (int i = 0; i < names.length; i++) {
            System.out.println("Bitte geben sie den " + (i+1) + " Namen ein");
            names[i] = sc.nextLine();
        }

erhalte ich folgenden Output

Bitte geben sie den 1 Namen ein
Bitte geben sie den 2 Namen ein

(Das erste Element wird übersprungen und ich kann auch nur elements-1 Elemente einlesen) jemand eine Idee woran es liegen kann?

Mfg

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

ich nehme mal an, dass dein sc ein

1
Scanner sc = new Scanner(System.in);

ist. Die Sache ist dann die, dass dein .nextInt() nur die Zahl liest und nicht die gesamte Zeile. Das heißt, wenn du zum Beispiel „3“ eingibst und dann Enter drückst, wird aus dem Eingabepuffer nur die „3“ gelesen – das abschließende Enter bzw. das Newline-Zeichen bleibt aber im Puffer. Wenn du danach die Schleife betrittst und .nextLine() aufrufst, findet diese Methode im Puffer nur ein einzelnes Newline-Zeichen. Sprich, es sieht für sie so aus, als hättest du einfach nur Enter gedrückt. Das Ergebnis ist, dass im ersten Element deines Arrays ein leerer String ("") steht, da .nextLine() das Newline-Zeichen zur Markierung des Zeilenendes nicht zurückgibt.

Beim zweiten Durchlauf der Schleife sind dann keine „Reste“ mehr im Puffer und es geht normal weiter.

Du kannst dir mal den Spaß machen und nach der Einlese-Schleife eine zweite Schleife hinschreiben, die alle Elemente des Arrays wieder ausgibt. Und dann gibst du ganz am Anfang, wenn du die Zahl der Elemente einliest, nicht einfach nur „3“ ein, sondern zum Beispiel „3 eins“. Dann machst du normal weiter. Dabei sollte etwas in dieser Art herauskommen:

3 eins
Bitte geben sie den 1 Namen ein
Bitte geben sie den 2 Namen ein
zwei
Bitte geben sie den 3 Namen ein
drei

Testausgabe der Elemente:
0:  eins
1: zwei
2: drei

Da sieht man noch einmal ganz deutlich, dass .nextInt() wirklich nur die Zahl ausliest, denn das erste Element des Arrays ist „ eins“ (inklusive des Leerzeichens).

HTH. ☺

Antworten |