Vector enthält nur letztes eingetragene Element

Status
Nicht offen für weitere Antworten.

Arp

Mitglied
Hi!

Ich habe grad den Fehler, das ich in einen Vector in einer While Schleife elemente gespeichert habe.
Wenn ich es aber wieder auslesen will, stelle ich fest, das im ganzen vector nur das letzte Element drin ist.
Also es ist die richtige Anzahl an Elementen gespeichert, aber immer nur das gleiche.

Ich finde grad keine lösung...

Probiert hab ich Vector.add(element), Vector.addElement(element), sogar insertElementAt(element, index)...
jedesmal das gleiche...

Komischerweise funktioniert es prima, wenn das Element ein bloßer String ist.
Aber sobald ich als Element eine eigene klasse habe, gehts nicht mehr.

Weiss jemand rat?
 
Da dir vermutlich klar war das der Fehler nicht in der SUN Implementierung liegt, sondern eher in deinem Code, kannst du dir vermutlich auch denken das es schwierig ist ohne Code etwas dazu zu sagen :wink:
 
kein problem 🙂

Code:
boolean eof = false;
zeile = "";
Vector Gelb = new Vector();

while(!eof)
{
    if(zeile == null)
        eof = true;
    else
    {
        zeile = datei.readLine();
        if(zeile != null)
        {
            sys.sysid = getSys(zeile);
            sys.koord = getKoords(zeile);
            sys.gatedist = getDist(sys.koord, gate_gelb);
            Gelb.add(sys);
        }
    }
}


das System.out hab ich nur zum testen drin. Es wird immer ein unterschiedliches sysid ausgegeben, was bedeutet das es bis zum Gelb.add problemlos funktioniert.
Aber aus irgendeinem grund steht im vector immer nur das zuletzt eingetragene objekt.
 
Code:
		for(int i = 0; i<Gelb.size(); i++)
			System.out.println( ((system)(Gelb.elementAt(i))).sysid);

size ist hier nun 78 weil weiter oben 78 mal eingefügt wurde.
Aber ich hab dann eben 78 mal das letzte element.

system ist übrigens diese klasse:

Code:
class system
{
	int sysid;
	int[] koord = new int[3];
	int gatedist;
}
 
Da diese Fragemente bis dahin korrekt aussehen bräuchte ich etwas kompilierbares um dir zu helfen.
Klassen schreibt man übrigens groß, und Variablen klein...
 
das ganze besteht aus fast 200 zeilen und braucht noch externe textdateien (aus denen eingelesen wird)... ich glaube nicht das es sinnvoll wäre den gesamten code reinzustellen 🙂

und das was davor/danach steht hat damit eigentlich auch nichts mehr zu tun, von daher glaube ich nicht das vorher ein fehler liegt.


Edit:
Ich hab grade ein System.out.println( ((system)(Gelb.elementAt(0))).sysid) nach dem Gelb.add() gemacht, und es steht da immer ein anderes...

Es scheint als würde add nichts hinzufügen, sondern das erste einfach überschreiben und dann nach hinten kopieren.
 
Arp hat gesagt.:
Edit:
Ich hab grade ein System.out.println( ((system)(Gelb.elementAt(0))).sysid) nach dem Gelb.add() gemacht, und es steht da immer ein anderes...

Es scheint als würde add nichts hinzufügen, sondern das erste einfach überschreiben und dann nach hinten kopieren.
Nein, macht es nicht, und nein, List#add hat auch keine Bugs :wink:
 
Code:
import java.io.*;
import java.util.Vector;

class system
{
	int sysid;
	int[] koord = new int[3];
	int gatedist;
}

class syssort
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader datei;
		BufferedReader gate = new BufferedReader(new FileReader("gates.txt"));
		
		Vector sort_gelb = new Vector();
		
		Vector Gelb = new Vector();
		
		system sys = new system();
	
		boolean eof = false;

		String zeile = "";
		
		int[] koords = new int[3];
		
		int[] gate_gelb = new int[3];
		
		zeile = gate.readLine();
		gate_gelb = getKoords(zeile);
			
		datei = new BufferedReader(new FileReader("Liste_gelb.txt"));
		zeile = "";
		eof = false;
		int lauf = 0;
		while(!eof)
		{
			if(zeile == null)
				eof = true;
			else
			{
				zeile = datei.readLine();
				if(zeile != null)
				{
					sys.sysid = getSys(zeile);
					sys.koord = getKoords(zeile);
					sys.gatedist = getDist(sys.koord, gate_gelb);
					Gelb.insertElementAt(sys, lauf);
					lauf++;
				}
			}
		}

		
                for(int i = 0; i<Gelb.size(); i++) 
                    System.out.println( ((system)(Gelb.elementAt(i))).sysid);		
	}
	
	
public static int getDist(...)
{...}
	
public static int[] getKoords(...)
{...}
	
public static int getSys(...)
{...}
}
so, mal eine etwas abgespeckte version damits nicht zu lang wird...

habe eine Laufvariable eingefügt um das Element an einer bestimmten Position einzufügen, und es entsteht immernoch der gleiche effekt.
 
aaahh... du meinst im vector steht jeweils nur eine referenz, und wenn ichs änder, wirds auch im vector geändert?
 
Nein, du hast nur eine Instanz. Du erstellst nur ein einziges mal eine Instanz von System (hast also auch nur einen satz Variablen) und fügst diese eine Instanz immer wieder in den Vektor ein.
 
aber ich änder ja die einträge der instanz bevor ichs einfüge... dann sollte doch immer was anderes im vector stehe.
 
Hab das system sys = new system(); nun in die While Schleife verschoben, und jetzt funktionierts.
thx 🙂
 
Arp hat gesagt.:
Hab das system sys = new system(); nun in die While Schleife verschoben, und jetzt funktionierts.
thx 🙂

Ich hatte mal das gleiche Problem (*haareausgerauf*), ich hab dann einfach vector.addElement(variable.clone());
genommen.
Damit hats hingehauen 🙂

Gruß
Hatti
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben