2017-12-03 2 views
0

Ich habe eine Klasse Container, wo ein Benutzer eine beliebige Anzahl von Wörtern eingeben kann, bis er nichts eingibt. Ich habe addWord (Word) Methode, bei der jeder Eingang zu einer ArrayList Worte jedes Mal hinzugefügt wird, wenn do/while-Schleife ausgeführt wird. Ich übergebe Benutzereingabewert als Parameter, um die Methode addWord() bei jedem Durchlauf der Schleife zu verwenden.Warum druckt meine display() -Methode nicht alle ArrayList-Elemente?

Jetzt möchte ich alle Elemente eines Arrays mit display() Methode anzeigen, sobald die Do/While-Schleife nicht mehr ausgeführt wird. Aber aus irgendeinem Grund, wenn ich versuche, method display() aufzurufen, zeigt es nur ein leeres Array [].

Gibt es eine Möglichkeit, wie Sie helfen können?

import java.util.ArrayList;            
import java.util.List;            
public class Container {             
    private List<String> words;            
    public Container() {             
    }            
    public List<String> getWords() {             
     return words;            
    }            
    public void setWords(List<String> words) {            
     this.words = words;            
    }            
    public void addWord(String word) {            
     words = new ArrayList<String>();            
     words.add(word);           
    }            
    public void display() {            
     System.out.println(words);      
    }            
} 

Main-Methode:

import java.util.Scanner;            
public class ContainerMain            
{            
    public static void main(String[] args)             
    {            
    Container one = new Container();             
    Scanner myScan = new Scanner(System.in);          
    String word = "s";       
    do            
     {            
     word = myScan.nextLine();            
     one.addWord(word);            
     }            
    while (!word.equals("")); 

    if (word.equals("")) {            
     one.display();             
    }            
    else {            
     System.out.println("No hope fam");     
    }            
    }            
} 
+0

Sie initialisieren Ihre ArrayList jedes Mal, wenn die Methode addWord aufgerufen wird. Sie haben nur das Wort, das beim letzten Anruf übergeben wurde. – prsvr

Antwort

3

Sehen Sie sich Ihre addWord Methode:

public void addWord(String word) {            
    words = new ArrayList<String>();            
    words.add(word);           
} 

Jedesmal, wenn Sie so nennen, es eine neue Liste erstellen geht - so können Sie nie am Ende mit mehr als einem Wort darin.

Die erste Zeile, die words initialisiert, sollte in Ihrem Konstruktor sein (oder als Feldinitialisierer). Dann entfernen Sie die Zeile von addWord - idealerweise die words Feld zur gleichen Zeit, um Fehler wie diese in der Zukunft zu vermeiden, und entfernen Sie die setWords Methode, es sei denn Sie wirklich brauchen es für etwas anderes.

Das ist alles falsch in Container (obwohl es nicht klar ist, dass es wirklich bietet keinen Wert über nur eine List<String> direkt verwenden). Wie in den Kommentaren erwähnt, fügt Ihre Do/While-Schleife in main eine leere Zeichenfolge am Ende hinzu. Es hat auch keinen Sinn zu überprüfen, ob word leer ist oder nicht nach die Schleife - es muss sein, sonst hätten Sie die Schleife nicht verlassen!

+0

Auch der Do-While-Teil fügt ArrayList eine leere Zeichenfolge als Wort hinzu. –

+0

@Ladislav_M: Wahr. Wird das in der Antwort notieren. –

+0

danke Jungs :) Auch, um den letzten leeren String zu drucken, sollte ich nur das letzte Array-Element vor dem Aufruf von display() löschen oder gibt es einen besseren Weg? – Joe

Verwandte Themen