# Vector in ein Array umwandeln



## Pudelchen (14. Dez 2004)

koennte mir einer erklaeren wie ich einen Vector in ein Array umwandle?
Ich weiss irgendwas mit toArray() aber wie geht die Syntax genau?


----------



## bygones (14. Dez 2004)

toArray liefert nur einen Object[] zurück...
sagen wir du hast einen Vector mit Strings

```
String[] sA = (String[])vector.toArray(new String[vector.size()])
```

statt String dann einfach den Typ der im Vector sthet


----------



## L-ectron-X (14. Dez 2004)

Weils häufiger vorkommt, ein String-Beispiel:

```
String[] str = (String) myVector.toArray();
```
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html#toArray()

Edit: hehe dbac, der gleiche Grundgedanke. Wo das wohl her kommt... :wink:


----------



## bygones (14. Dez 2004)

leider net ganz L-ectron-X


----------



## DTR (14. Dez 2004)

Die Syntax findes du hier:
http://java.sun.com/j2se/1.4.2/docs/api/


----------



## Student (14. Dez 2004)

DTR hat gesagt.:
			
		

> Die Syntax findes du hier:
> http://java.sun.com/j2se/1.4.2/docs/api/



wenn schon so eine "genaue" angabe, dann aber doch bitte die neueste version ;-) .. also 1.5.0  :meld:


----------



## L-ectron-X (14. Dez 2004)

@dbac: Hm, ich ich liebe die Collections, weil sie so mächtig sind und man jede Menge lernen kann.
Ich habe mich verhauen? Wo denn? Etwa bei den Array-Klammern?

@Student: 1.4er kein Problem aber ich tue mich etwas schwer mit der 1.5er Dokumentation.
Vielleicht kann mir das ja mal jemand klar machen:


			
				API-Doc 1.5 hat gesagt.:
			
		

> public <T> T[] toArray(T[] a)


----------



## bygones (14. Dez 2004)

siehe meinem Post. du musst der Methode den ArrayTyp mitgeben damit sie per Reflection den Array erstellen und dann mit den elementen füllen kann.

zu 
	
	
	
	





```
public <T> T[] toArray(T[] a)
```
das ist eine generische Methode. T ist eine Typvariable. das <T> ist sozusagen: "Methode, achtung, eine Typvariable namens T wird hier benutzt". T kann eine beliebige Klass sein. D.h. man gibt der Methode einen Array vom Typ T (z.b. String) und er gibt dir dann den Typ als Array wieder zurück (gefüllt mir der Collection)...

d.h. ab 1.5 geht das dann auch so:

```
String[] ss = s.toArray(new String[s.size()]);
```
mit s = Collection....

verständlich ?


----------



## L-ectron-X (14. Dez 2004)

deathbyaclown hat gesagt.:
			
		

> du musst der Methode den ArrayTyp mitgeben damit sie per Reflection den Array erstellen und dann mit den elementen füllen kann.


OK, Du benutzt die Methode

```
toArray(Object[] a)
```
Ich habe die

```
toArray()
```
benommen. Was ist daran falsch? Wird mit dieser Methode nicht auch wenigstens ein Object-Array erstellt?

Edit: Mist, habe gerade kein Editor und kein SDK zur Hand, sonst hätte ich es längst ausprobiert. :?


----------



## bygones (14. Dez 2004)

ja ein Object[] array - aber kein String Array !

```
String[] ss = s.toArray(new String[s.size()]);
Object[] oo = s.toArray();
ss = (String[])oo;
```
führt zu einer ClassCastException...


----------



## Bleiglanz (14. Dez 2004)

wegen des Erasure + Kompatibilität musst du ein Array vom richtigen Typ erst reinstecken

```
public <T> T[] toArray(T[] a)
```
das erste <T> ist der generische Typ T (gehört zu den Modifiern)
T[] ist der Rückgabetyp der Funktion und T[] a einfach das Argument

ein echter krampf, ich hätte mir auch gewünscht, dass eine
List<Birnen> eine einfache Birnen[] toArray(); haben würde; aber leider geht das wohl nicht...


----------



## Pudelchen (14. Dez 2004)

Das mit dem umwandeln wuerde ja auch klappen. aber ich habschon wieder ein neues Problem mit diesem Vector zeug. 
Also kurz mal hier der Code:

```
public void DateiLesen(Vector v)throws FileNotFoundException, IOException{
     
     File datei = new File("Parametertabelle.txt");
     leser = new FileReader(datei);
     int gelesenInt = 0;	
      
        String Zeichen;
        for(int i=0; i<100; i++){
    	Zeichen="";
        try{
        gelesenInt = leser.read();
        
        char gelesenChar = (char) gelesenInt;
        
     	while((gelesenChar!=' ')&&(gelesenChar!='\t')&&(gelesenChar!='\n')){
     	  	Zeichen=Zeichen+gelesenChar;
       		gelesenInt = leser.read();
       		gelesenChar = (char) gelesenInt; 
      		}
       } catch(IOException e){ e.printStackTrace();}
        v.addElement(Zeichen);
       
       
    	}               
}
```
Hier lese ich mein Woerter in den Vector, aber jetzt kommst:
Irgendwas mach ich falsch, denn hier wird diese Funktion aufgerufen:

```
public void init (){
        
              
                try{
        		DateiLesen(v);
                        System.out.println(v);
                }catch(IOException e){ e.printStackTrace();}
      
                String[] s = (String[])v.toArray(new String[v.size()]);
```
Aber er gibt mir den vector nicht mehr aus. Der Compiler meldet auch keinen Fehler. An was kann den das liegen?


----------



## bygones (14. Dez 2004)

das mit dem komischen toArray zeugs (ich stimme Bleiglanz zu) stammt daher weil REflections genutzt werden.

Code von toArray()

```
public Object[] toArray() {
	Object[] result = new Object[size];
	System.arraycopy(elementData, 0, result, 0, size);
	return result;
    }
```
und von toArray(T[]) 

```
public <T> T[] toArray(T[] a) {
        if (a.length < size)
            a = (T[])java.lang.reflect.Array.
		newInstance(a.getClass().getComponentType(), size);
	System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }
```

das ist ein generics problem - da man nicht 
	
	
	
	





```
T[] tArray = new T[size];
```
 machen kann


----------



## Bleiglanz (14. Dez 2004)

nur so zur info

wenn die List zufällig leer ist, also zu laufzeit kein einziges Element mehr enthält, dann gibt es real keine Möglichkeit, den Rückgabetyp zu ermitteln...


----------



## L-ectron-X (14. Dez 2004)

Zeile 1 ist klar, aber...


			
				deathbyaclown hat gesagt.:
			
		

> Object[] oo = s.toArray();
> ss = (String[])oo;


Sorry mein Freund, aber das scheint nicht zu funktionieren. Sicher, dass das stimmt? ???:L


----------



## bygones (14. Dez 2004)

natürlich klappt das net - ich habe ja auch geschrieben, dass das eine Exception wirft !


----------



## Pudelchen (15. Dez 2004)

Oh Oh, Jungs,
Ich gebs ja nur ungern zu aber das ist mir irgendwie ne Nummer zu hoch. Ich bin in Sachen Java noch gruen hinter den Ohren. 
Kann mir jemand anfaengerfreundlich sagen wie ich denn nun den Verctor von der einen in die andere Funktion bekommen kann? und dann in der neuen Funktion in ein Array umwandle?
Bitte


----------



## bygones (15. Dez 2004)

Pudelchen hat gesagt.:
			
		

> Oh Oh, Jungs,
> Ich gebs ja nur ungern zu aber das ist mir irgendwie ne Nummer zu hoch. Ich bin in Sachen Java noch gruen hinter den Ohren.
> Kann mir jemand anfaengerfreundlich sagen wie ich denn nun den Verctor von der einen in die andere Funktion bekommen kann? und dann in der neuen Funktion in ein Array umwandle?
> Bitte


sry  :wink: 

in eine andere Funktion einfach über Parameter - oder versteh ich das falsch...
das umwandeln siehe meinen ersten Post mit dem String[] beispiel


----------



## Bleiglanz (15. Dez 2004)

Pudelchen hat gesagt.:
			
		

> Hier lese ich mein Woerter in den Vector, aber jetzt kommst:
> Irgendwas mach ich falsch, denn hier wird diese Funktion aufgerufen:
> 
> ```
> ...



das toArray sollte definitiv funktionieren?

bist du sicher, dass v das richtige v ist?

mach mal System.out.println(v.size())?

Bitte präzisiere "Aber er gibt mir den vector nicht mehr aus", was heisst das?


----------



## Reality (15. Dez 2004)

Hi!


			
				deathbyaclown hat gesagt.:
			
		

> ja ein Object[] array - aber kein String Array !
> 
> ```
> String[] ss = s.toArray(new String[s.size()]);
> ...



Warum ist das eigentlich so?

Liebe Grüße
Reality


----------

