String einem String[] hinzfügen

  • Themenstarter Themenstarter dofa
  • Beginndatum Beginndatum
D

dofa

Gast
hallo leute, ich hab ein problem. und zwar hab ich ein string[] mit der größe n gegeben. jetzt soll der benutzer einen string eingeben, der dann der liste hinzugefügt werden soll.
das problem ist, dass der string nicht angehängt wird sondern einfach den ersten überschreibt.
ich hab keine ahnung woran das liegt, kann eigentlich nur ne kleinigkeit sein, die ich übersehen habe.

Java:
public class FiniteList{
	
	private String[] liste;
	private boolean isFull = false;
	private int n;
	
	public FiniteList(){
		liste = new String[10];
	}
	public FiniteList(int n){
		liste = new String[n];
		this.n = n;
	}
	public void add(String s){
		for(int i = 0; i<n; i++){
			isFull();
			if(isFull=false && liste[i] == null)
				liste[i] = s;
		}
		
	}
	public boolean isFull(){
		for(int i = 0; i<n; i++){
			if(liste[i] != null)
				isFull=true;
		}
		return isFull;
	}
	public void display(){
		for(int i = 0; i<n-1; i++)
			System.out.println(liste[i]);
	}
}
 
in dem Programm ist ja ne Menge falsch,
es wird überhaupt nichts eingefügt, 'sondern einfach den ersten überschreibt.' stimmt nicht

wenn du den Konstruktor FiniteList() benutzt bleibt n 0, die meisten Methoden machen gar nichts mehr

isFull() setzt die Variable isFull auf true, sobal irgendein Element drin ist, egal was mit dem Rest ist, die Variable wird dann auf normalen Wege auch nie wieder false

auf unnormalen Wege schon: if(isFull=false && liste == null) setzt diese Variable auf false (= ist was anderes als ==), das if ist immer false, deshalb wird auch nie irgendetwas eingefügt
 
und warum erscheint dann als ausgabe:

(bei n=4)

eingegebenes wort
null
null
null

und wenn ich dann ein neues wort eingebe steht das dann anstelle des ersten wortes und der rest ist wieder null.
 
vielleicht hast du ja einen anderen Code als hier gepostet, einzelne Tippfehler wie das = statt == in Zeile 17 bewirken schon einen Unterschied
(mit == würde das erste Wort eingefügt, dann ist aber schon isFull true und danach ändert sich nichts mehr)



folgenden Code kann jeder kopieren und ausführen und wird gewiss keine andere Ausgabe erhalten
Java:
public class Test
{
    public static void main(String[] args)
    {
        FiniteList f = new FiniteList(4);
        System.out.println("a");
        f.add("eingegebenes wort");
        f.display();
        System.out.println("b");
        f.add("Wort 2");
        f.display();
        System.out.println("c");
    }
}


class FiniteList
{

    private String[] liste;
    private boolean isFull = false;
    private int n;

    public FiniteList()
    {
        liste = new String[10];
    }

    public FiniteList(int n)
    {
        liste = new String[n];
        this.n = n;
    }

    public void add(String s)
    {
        for (int i = 0; i < n; i++)
        {
            isFull();
            if (isFull = false && liste[i] == null) liste[i] = s;
        }

    }

    public boolean isFull()
    {
        for (int i = 0; i < n; i++)
        {
            if (liste[i] != null) isFull = true;
        }
        return isFull;
    }

    public void display()
    {
        for (int i = 0; i < n - 1; i++)
            System.out.println("x: " + liste[i]);
    }
}
Ausgabe:
Code:
a
x: null
x: null
x: null
b
x: null
x: null
x: null
c
beim display habe ich noch 'x:' eingefügt, aber das kann ja nicht stören,
die Schleife dort sorgt übrigens dafür, dass nur 3 der 4 Elemente ausgegeben werden, was deiner Ausgabe widerspricht,
es sei denn dort wird das Wort an sich ausgegeben und danach 3 Elemente aus der Liste, das würde dann wieder zusammenpassen 😉

aber ist ja auch ganz egal, löse die offenen Probleme, ein paar habe ich ja genannt
 
Zuletzt bearbeitet von einem Moderator:
so, ich hab jetzt ein paar änderungen vorgenommen, allerdings funktioniert das "add" nur halbwegs.
wenn ich bei n=4 4 wörter eingeb, sieht die ausgabe so aus:

1: 2:
wort1 wort2
wort1 wort1
null wort2
null null
 
argh!

ich mein das so:

wort1,wort1,null,null
wort2,wort1,wort2,null
wort3,wort1,wort2,wort3

dann abbruch wegen "isFull()"

Java:
private int i = 0;

public void add(String s){	
		isFull();
		if(isFull == false && liste[i] == null){
			liste[i] = s;
		i++;
		}
	}

	public boolean isFull(){
		for(int i = 0; i<n; i++){
			if(liste[i] == null)
				isFull = false;
			else
				isFull = true;
		}
		return isFull;
	}

        public void display(){
		for(int i = 0; i<n-1; i++)
			System.out.println(liste[i]);
	}
 
Was ist denn dein grundsätzliches Prinzip bei dieser Aufgabe. Im Moment wirkst so bisschen gecodet und hoffen das es das Richtige macht.

Du kannst zum Beispiel mittels eines Index festhalten wo das erste Feld ist.

Java:
int freiesFeld = 0;

add(xyz) {
if(freiesFeld<array.length() {
array[freiesFeld] = xyz;
}
}

edit: Der Code oben ist ziemlich wirr. isFull(); bewirkt garnichts
 
> isFull(); bewirkt garnichts
doch doch, ändert ein Klassenattribut, das danach abgefragt wird..

@dofa
besteht noch eine Frage?

es wäre auch günstig deine main-Methode dahzuzuposten
 
wieso soll das nichts bewirken?

ich hab in der main-methode ne schleife, wo er nach dem wort fragt, was hinzugefügt werden soll.
und wenn dann isFull()==true, dann soll er die schleife abbrechen und das macht er auch wenn alle felder belegt sind (siehe mein post). also funktioniert das doch.

und das mit dem freien feld hab ich doch auch so gemacht:

private int i = 0; = freies Feld

wenn, isFull() == false && liste[freies Feld] == null (also frei), dann liste[freies Feld] = wort.

was mich wundert ist, dass er beim ersten wort die ersten beiden felder belegt und dann zwar, wie gewünscht, jedes mal das neue wort hinten dranhängt, aber das erste überschreibt.
 
Java:
public class Bsp19{
	
	public static void main(String[] args){
	
	String wort;
	int laenge;
	
	System.out.println("Geben Sie die laenge der Liste an.");
	laenge = SavitchIn.readLineInt();
	
	if(laenge<0)			
	 System.out.println("Negative Groesse unmoeglich.");
	
	else{
		FiniteList neueliste = new FiniteList(laenge);
		do{
		System.out.println("Geben Sie ein neues Wort ein.");
		wort = SavitchIn.readLine();
	
		neueliste.add(wort);
		if(neueliste.isFull() == true){
			System.out.println("Die Liste ist voll.");
			break;
		}	
		else	
			neueliste.display();	
		}
		while(); //hier brauch ich noch irgendeine vernünftige abbruch bedingung. hab bis jetzt einfach was reingeschrieben,
                           //damit ich das programm ausprobieren kann.
	}
	}
}
 
dein add() ist ok,

wie weiter oben schon geschreiben: display zeigt von 4 Werten sowieso nur 3 an,
ich vermute dass du einen Aufbau hast, der erst die aktuelle Eingabe ausgibt und dann von der Liste die ersten 3 Elemente,
poste deine main-Methode! (edit: hast du ja jetzt, ich schaue)
 
hmm, in deinem Programm ist nichts direkt zu sehen,
du verwechselst nicht zufällig die von dir eingetippte Eingabe mit einer Ausgabe?
zur Sicherheit und Eindeutigkeit verwende bitte ab jetzt folgendes display():

Java:
    public void display()
    {
        System.out.println("jetzt kommt die Liste:");
        for (int i = 0; i < n - 1; i++)
        {
            System.out.println("Index " + i + " von " + n + ": " + liste[i]);
        }
        System.out.println("Index " + (n - 1) + " von " + n + " = " + liste[n - 1] + " verrate ich nicht.");
    }
 
es funktioniert, vielen dank 🙂

ich sollte vor dem print(liste); noch ein print(); einfügen, dann erkenn ich beim nächsten mal auch, dass das erste wort die eingabe war und nicht zur liste gehört 😀
 

Neue Themen


Zurück
Oben