PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vector Probleme!



banshee
16-08-2005, 13:21
Hi ,
ich habe ein kleines Vector Problem und hoffe nun auf euro Hilfe ! :D

Ich habe einen Vector in dem ich Werte vom Typ Long speicher.
Diese Long Variablen habe ich wie folgt angelegt.

Long test[] = new Long[50];

Das Speichern funktioniert auch soweit nur bekomme ich die Daten nichtmehr aus meinem Vector alle Versuche mit Typumwandlung wieder an die Werte zu kommen sind Fehlgeschlagen (ClassCastException)

Mein Vectorstruktur sieht folgendermaßen aus

Vector[0] -> Long[50] -> Long "longWert"
-> Long "longWert"
Vector[1] -> Long[50] -> Long "longWert"
-> Long "longWert"

Wie komme ich nun an meine longWerte ??

Probiert habe ich folgendes.
getItemItems ist mein Vector.
Times ist die klasse in der ich meine verschiedene Vectoren gespeichrt habe.

Long test[] = new Long[50];
test[i] = (Long) times.getItemTimes().elementAt(i);

Mit Long.ValueOf(times.getItemTimes().elementAt(i)).lo ngValue();

komme ich leider auch nicht weiter.

bischi
16-08-2005, 13:32
Long test[] = new Long[50];
test[i] = (Long) times.getItemTimes().elementAt(i);


Ich nehm mal an, Times sollte gross geschrieben sein...

folgendes sollte gehen:

test[i] = Times.getItemTimes.elementAt(i);

Da, wie ich annehme, getItemTimes der Variabelname des Vektors ist. Ev musst du das (Long) noch lassen - musst mal ausprobieren.

MfG Bischi

banshee
16-08-2005, 14:37
Nein times ist eigentlich kleingeschrieben.
Habe doch vorher irgendwoe
Times times = new Times();
Die Klasse ist von mir selber erstellt. Gibt es schon eine Klasse in Java die so heisst?

peschmae
16-08-2005, 15:05
Wie erstellst du denn den Vector genau?

MfG Peschmä

banshee
16-08-2005, 15:20
Der Vector ist global und würde so erzeugt:

static Vector registerItemTimeValues = new Vector();

elemente habe ich so eingefügt

registerItemTimeValues.addElement(registerItemTime s);

wobei registerItemTimes so aussieht

Long registerItemTimes[] = new Long[50];

Zum Schluss übergebe ich den Vector dann an meine setFunktion der times klasse

times.setItemTimes(registerItemTimeValues);

bischi
16-08-2005, 16:34
geht

test[i] = times.getItemTimes.elementAt(i);

jetzt oder nicht? Vielleicht könntest du mal allfällige Fehler posten...

MfG Bischi

anda_skoa
16-08-2005, 16:47
wobei registerItemTimes so aussieht

Long registerItemTimes[] = new Long[50];


Wenn du als Vector Elemente Long[] hast, würde ich dann beim elementAt auch zu einem Cast auf diesen Typ raten :)

Typsichere Container wäre schon fein :D

Ciao,
_

banshee
16-08-2005, 16:50
nein , test[i] = times.getItemTimes.elementAt(i);

geht leider nicht. getItemTimes ist doch auch eine Funktion und du musst ja eine Typumwandlung machen. Der Vektor gibt ja nur nen object zurück.
Bin leider noch immer nicht weitergekommen :-(

Was meinst du mit allfällige Fehler???

peschmae
16-08-2005, 20:57
Wenn du als Vector Elemente Long[] hast, würde ich dann beim elementAt auch zu einem Cast auf diesen Typ raten :)

Typsichere Container wäre schon fein :D


Naja, die gibts ja mittlerweile seit Java 1.5. Ähm Java 5 meine ich ;)

MfG Peschmä

anda_skoa
16-08-2005, 21:53
Naja, ich glaube nicht wirklich. Da wird nur der Cast implizit gemacht bzw generiert.

Das konnte man bisher auch schon mit einer Wrapperklasse, was sich meistens auch auszahlt.

Eigentlich müßte banshee bei dem Versuch das Long Array auf einen Long zu casten eine Cast Exception bekommen.

Vielleicht ein catch(Throwable t) {} irgendwo? ;)

Ciao,
_

peschmae
17-08-2005, 11:56
Naja, ich glaube nicht wirklich. Da wird nur der Cast implizit gemacht bzw generiert.

Läuft das nicht aufs gleiche raus? Ich meine ob der das jetzt als Long[] speichert und mir so zurückgibt oder als Object und das dann nach Long[] casted bevor ich das kriege kann mir ja egal sein. (Zumindest hier - schon möglich dass das anderswo einen Unterschied macht)

MfG Peschmä

anda_skoa
17-08-2005, 14:38
Ein echter typabhängiger Container, wie ihn zum Beispiel C++ Templates generieren, brauchen keinen Cast und keine damit verbundene Typuntersuchung und Fehlerbehandlung.

Ist mir völlig schleierhaft, warum man sich bei Generics für diese Templatesimulation entschieden hat, wo Generics ohnehin einen neuen Compiler vorraussetzt.

Ciao,
_

peschmae
17-08-2005, 14:57
Ein echter typabhängiger Container, wie ihn zum Beispiel C++ Templates generieren, brauchen keinen Cast und keine damit verbundene Typuntersuchung und Fehlerbehandlung.


Fehlerbehandlung und so sollte es ja eigentlich nicht brauchen da der Typ ja eh nur der richtige sein kann.

MfG Peschmä

mwanaheri
18-08-2005, 15:51
Hi ,
ich habe ein kleines Vector Problem und hoffe nun auf euro Hilfe ! :D

Ich habe einen Vector in dem ich Werte vom Typ Long speicher.
Diese Long Variablen habe ich wie folgt angelegt.

Long test[] = new Long[50];


Ich weiß nicht recht, ob es da hakt, aber da legst du keine Long-Variable an, sondern ein Long(!)-Array. In deinem Vektor befinden sich also nicht Long-Werte, sondern Long-Arrays.
Man bachte auch die Groß- und Kleinschreibung: Es handelt sich hier um Objekte, nicht um den Datentyp long.

peschmae
18-08-2005, 23:16
Ok, ok, anda_skoa gewinnt mal wieder - ich hab eben ein Interview mit Anders Hejlsberg (http://www.artima.com/intv/genericsP.html) gelesen und der erwähnt einen wichtigen Punkt den ich nicht beachtet habe: Rtti mit einem Vector<Foo> geht nicht wirklich gut.

MfG Peschmä

ghostrifle
19-08-2005, 22:47
Long test[] = new Long[50];
test[i] = (Long) times.getItemTimes().elementAt(i);


Du hast nur das Array angelegt, aber die einzelnen Elemente noch nicht !

Der Code müsste meinem Wissen nach so aussehen:



Long test[] = new Long[50];
for(int i = 0; i < 50; i++)
{
test[i] = new Long();
}

test[i] = (Long) times.getItemTimes().elementAt(i);


Falls Du das irgendwann schon mal irgendwo im Code gemacht hast ok....

dann fällt noch folgendes auf

Du schiebst in den Vektor ein Array an sagen wir mal PLatz 3.
Jetzt willst Du wie oben in deinem Beispiel da was rausholen... das müsste dann so aussehen


Long test[] = new Long[50];
for(int i = 0; i < 50; i++)
{
test[i] = new Long();
}

times.getItemTimes().add("bla");
times.getItemTimes().add("blubb");
times.getItemTimes().add(test);

Long test[] = (Long[]) times..getItemTimes().elementAt(3); // an dieser Stelle ist ein Array im Vektor,kein einzelnes Objekt !!!!
Long blasehase = test[irgendeinezahl];


Ich bin kein Fan von Arrays... würde da immer einen Vektor dafür empfehlen...

Hoffe ich konnte Helfen :o

anda_skoa
20-08-2005, 16:18
Du hast nur das Array angelegt, aber die einzelnen Elemente noch nicht !

Oh bitte nein!

Selbst das new des Array ist schon zuviel, das Array kommt ja aus dem Container

Weiter unten ist es richtig


File[] test = (Long[]) times.getItemTimes().elementAt(3);


Ciao,
_

peschmae
20-08-2005, 22:33
Oh bitte nein!

Selbst das new des Array ist schon zuviel, das Array kommt ja aus dem Container


Naja, wir haben ja Garbage Collection :p

*scnr*

MfG Peschmä

anda_skoa
22-08-2005, 22:51
Zuerst einer der Laufzeitmäßig teuersten Operationen (Object Creation) verwenden und dann über Performance meckern :D

Ciao,
_