# Vector



## dadom110 (8. Dezember 2005)

Moin Zusammen, 

beschäftige mich gerade mit Vektoren, und da hätte ich ein kleine Problem: Vektoren nehmen ja nur Objekte auf, kann man das ändern? Also das er nur Integer Werte oder nur Objekte eines bestimmten Typs aufnimmt? Weil nehmen wir mal an ich erstelle ein Vektor der JTextFields aufnimmt, ist ja alleine schon das ändern des Feldtextes ein Beinbruch, würde doch so aussehen:


```
public void tAccess()
	{
		Vector vec=new Vector(10,1);
		JTextField txt_feld=new JTextField("Hallo");
		vec.addElement(txt_feld);
		
		if (vec.get(0) instanceof JTextField) {
		((JTextField)vec.get(0)).setText("Neu");}
	}
```

Dann müsste ich ja bei jeder Textfeld Funktion die Abfrage machen, ob es denn ein Textfeld ist, kann man das nicht eingrenzen, das man nur Textfelder einfügen kann, damit man sich diese Überprüfung spart?

Mfg
Dom


----------



## TommyMo (8. Dezember 2005)

Wenn du Java 1.5 verwendest, dann kannst du Templates einsetzen. Ich hab dazu leider noch nichts gemacht, aber Mr. Google sollte sicherwas  zum Thema Syntax finden denk ich   

Gruß
TOM


----------



## TommyMo (8. Dezember 2005)

Ok, vielleicht reicht das schon:


```
List<Integer> myList = new List<Integer>();
```

Gruß
TOM


----------



## dadom110 (8. Dezember 2005)

Ok, scheinbar tue ich das nicht, Fehler beim Paramer (< > ) 
"Syntax error, parameterized types are only available if source level is 5.0" 

Aber ich hab das neueste, dachte ich bis dato zumindest, das heisst fast das neueste, das letzte Update hat er vor ein paar tagen agebrochen, zur Zeit "Version 1.5.0 (Build 1.5.0_05-b05)" Damit sollte das gehen? Also ich weiss nicht warum du jetzt ne "list" benutzt, aber wenn ich das mit meinem Vector zu versuche, bekomme ich oben erwähnt Fehlermeldung.


```
Vector<JTextField> vec=new Vector<JTextField>(10,1);
```

In der API steht auch was von dem <E>, aber da wird irgendwie auf Interface Iterable<T> verwießen, bin mir nicht sicher ob ich das richtig Interpretiert habe 

Mfg
Dom


----------



## mart (8. Dezember 2005)

Hi,

sieht ganz so aus, als ob da in Deiner Entwicklungsumgebung die Compiler-Einstellung nicht passt. Für den Fall dass du eclipse nutzt, schau mal unter Window -> Preferences -> Java -> Compiler. Da kannst du dann Deinen Compiler auf JDK 1.5 umstellen.

Falls du ne andere IDE benutzt ... keine Ahnung wo das einzustellen ist

Ich hoffe das hilft dir weiter...


----------



## dadom110 (8. Dezember 2005)

mart hat gesagt.:
			
		

> schau mal unter Window -> Preferences -> Java -> Compiler. Da kannst du dann Deinen Compiler auf JDK 1.5 umstellen..



ahhh ich habs gefunden  dank dir, das wars, jetzt erkennt er die die <>  Super, wieder was gelernt, funktioniert einwandfrei, danke ! Eine Altmodische Variante für das Problem gibt es nicht oder? Also falls User des Programms eine ältere Version von Java installiert haben, wird das Programm ja sicherlich nicht laufen ?!

Dom


----------



## mart (8. Dezember 2005)

Hi,

ja, da hast du recht. Vor JDK-1.5 läuft das nicht. Die altmodische Variante mit der instanceof-Prüfung war dir ja zu umständlich


----------



## dadom110 (8. Dezember 2005)

Hi..

was gibt es denn für Vor-/Nachteile zwischen einem Vektor und einem Array? Ich meine schöner ist beim Array ja die mehrdimensionalität, bei nem Vektor müsste man da ja wieder einen Vektor machen der wiederum Vektoren in sich trägt. Weswegen ich bei meinem Programm von nem Array auf einen Vektor umgestellt habe, ist die dynamische Erweiterung, bei nem Array müsste ich dann ja eine extra Funktion schreiben, die den Array zwischenspeichert, den alten Array erweitert und dann die Werte wieder einsetzt, das erspart mit der Vector. Ein paar Erfahrungen von den "alten"-"Hasen"?

Mfg
Dom


----------



## mart (8. Dezember 2005)

Hi Dom,

tja, also soooo alt ist der Hase jetzt auch noch nicht    Bin auch gerade am Java-lernen.

Im Prinzip hast du den größten Unterschied zwischen Array und Vector ja schon genannt (dynamische Erweiterbarkeit). So spontan fällt mir da jetzt nix weiter dazu ein...

Aber für dein konkretes Problem mit den "< >" ist das ja eigentlich ohne Belang, oder?


----------



## TommyMo (8. Dezember 2005)

Einfach mal in die Doc schaun   Vector 

Gruß
TOM

PS: warum ich List und nicht Vector genommen --> gegooglet und das erste Beispiel mit Templates genommen


----------



## dadom110 (8. Dezember 2005)

mart hat gesagt.:
			
		

> Hi DomAber für dein konkretes Problem mit den "< >" ist das ja eigentlich ohne Belang, oder?



Das ist richtig, aber aus Gründen der Komptibilität, müsste ich mich jetzt entscheiden, die relativ neue Metode der Templates zu benutzen (- Kompatibilität) oder den genannten Umweg über das erweitern von Arrays "per Hand" zu machen. (Array zwischenspeichern, erweitern und zurück schreiben) Aber denke ich werde es erst mal bei dem Vector belassen, ist ja viel schöner so 

Mfg
Dom


----------



## schnuffie (8. Dezember 2005)

Java stellt ein ganzes Säckle an Collections zur Verfügung.

Es gibt als Listen Vectoren (synchronisiert, langsamer als LinkedList und ArrayList), ArrayList (unsynchronisiert, schnell beim Füllen) und LinkedList (unsynchronisiert, schnell beim Einfügen und Herauslöschen).

Für Deine Aufzählung wäre sicherlich die ArrayList optimal, da Du anscheinend die Liste einmal füllst, dann bleibt sie wie sie ist, nur das die Texte jeweils geändert werden und mehrere Threads greifen scheinbar auch nicht drauf zu, da ist die Synchronisierung unwichtig.

Willst Du Dein Problem "altmodisch" lösen, bietet sich Vererbung an:


```
public class TextFieldList extends ArrayList {
  public TextFieldList() {
	super();
  }
  public TextField getTextField(int i) {
	if (super.get(i) instanceof TextField) {
	  return (TextField)super.get(i);
	}
	else {
	  return null;
	}
  }
}
```
 
Schon brauchst Du in Deinem Programm nicht mehr casten.


----------



## dadom110 (8. Dezember 2005)

So hatte ich das ja zum Anfang hin auch angedacht, nur Problem war dabei ja (wie bereits beschrieben) das ich die Felder zwar nur einmal fülle, aber ich sie mehrmals wieder auslese, und dann jedes mal eine If-Konstruktion drum herum bauen muss, das war mir zu "aufwendig" bzw. zu umständlich.

Mfg
Dom


----------



## TommyMo (8. Dezember 2005)

Und was, wenn du dir eine eigene Methode schreibst? Du wirst zwar nicht um die Prüfung rum kommen, aber so brauchst du den Code dafür nur einmal schreiben. Wenn du dann ein Element ausliest, dann benutzt du einfach diese Methode. Wär das ein Vorschlag? 

TOM


----------



## dadom110 (8. Dezember 2005)

Das ist auch eine Idee, geht ja in die Richtung von Schnuffi, nur ohne extends, würde dann dann so lösen:


```
public void tAccess()
	{
	
	Vector vec=new Vector(1,10);
	JTextField txt_feld=new JTextField();
	vec.add(txt_feld);
	conv(vec.get(0)).setText("Neu");
	}
	
	public JTextField conv(Object ob)
	{
		if (ob instanceof JTextField) {
			return (JTextField)ob;}
		else
			return null;
	}
```

So hattets du es doch gemeint oder? Zwar nicht ganz so schön wie die "neumodische" Methode, aber zumindest um längen kompatibler, danke an alle junge, sowie alte Hasen 

Mfg
Dom


----------



## Thomas Darimont (8. Dezember 2005)

Hallo!

   Also ich wuerde mir keine eigenen Collections bauen... sondern die standardmaeszigen nehmen und entweder entsprechend Casten oder Java 5 Generics verwenden. Fuer "jedes" BO, dass prinzipiell in einer Liste gepackt werden kann, eine eigene spezielle BOList Klasse zu erstellen oder gar zu generieren nur um Typsicherheit zu erhalten halte ich fuer nicht wirklich erstrebenswert... das fuehrt nur zu einem Wildwuchs an Klassen und dadurch verliert man schnell den Ueberblick.


> ```
> public class TextFieldList extends ArrayList {
> public TextFieldList() {
> super();
> ...


Sorry, aber bei sowas bekomme ich ganz schlimm Bauchweh...

   Gruss Tom


----------



## schnuffie (9. Dezember 2005)

Haben die Magentropfen angeschlagen, Tom?  

Ich persönlich würde natürlich nicht wegen eines Casts eine eigene Klasse schreiben, doch der "Herr der Programmierung" ist immernoch der Entwickler - also das Problem bestand im "nicht soviel casten zu wollen". Dafür gibt's z.B. die 3 Lösungen:
- Java 5
- abgeleitete Klasse
- spezielle Methode

P.S.: Was soll an abgeleiteten Klassen schlecht sein? Die Vererbung ist doch gerade das, was eine objektorientierte Programmiersprache ausmacht.


----------



## TommyMo (9. Dezember 2005)

Stimmt, du hast vollkommen recht, Vererbung ist wirklich ein elementarer Bestandteil. 

Allerdings, und natürlich gibt es ein aber    , ist ein Wildwucher an Klassen auf jedenfall zu vermeiden, da damit, was Tom schon gesagt hat, und ich stimme ihm da 100% zu, die Übersichtlichkeit und somit dann auch die Wartbarkeit und Einarbeitungszeit unnötig verkompliziert werden. 

Gruß
TOM


----------

