# Vektor auslesen und Random



## iceT18 (22. November 2007)

Hallo,

Ich arbeite gerade an einem Beispiel und bin leider mit meinem Java-Latein am Ende :-( Vielleicht könnt ihr mir helfen!

Ich habe einen Vektor, der Strings beinhaltet z.B. {Haus,Maus,Apfel,Baum,Blume} Der Inhalt ist dabei immer variabel,weil er ausgelesen wird.
Ich will jetzt mit einer Random-Funktion Wörter aus dem Vektor auslesen (also z.b. bei n=5 Wörtern, n/2 oder n/3 oder n/4.....

Weiters hab ich einen String, der auch Wörter beinhaltet z.B. "Meine Maus baut sich ein Haus vor einem Baum".

Ich muss nun den String durchgehen und die Wörter aus dem Vektor erhalten habe durch ______ ersetzen.
Also z.B. Meine _______ baut sich ein Haus vor einem ______.

Wie mach ich das?
Danke für eure Hilfe!

Ich hoffe das Ganze ist halbwegs verständlich!

mfg
iceT


----------



## Wyatt (23. November 2007)

Hallo!

Zeig doch mal, wie weit du bisher gekommen bist 
Dann schau ich mir das gerne an und versuche zu helfen.

Gruß
Felix


----------



## iceT18 (25. November 2007)

Hi,

Danke erstmal. Ich hab bis jetzt folgendes:


```
String text = "";
for (int index = 0; index < list.size(); index++) {
  text += list.get(index).toString() + "\n";
 }
tokenpanel.setText(text);
```
 
und


```
Random r = new Random();
int rest = r.nextInt(6)+1;
System.out.println(rest);
```
 
Also in dem Vektor list sind meine Elemente drinnen, und mit der For-Schleife gebe ich meine Elemente in einem Textfeld namens tokenpanel aus. Im unteren Code erzeuge ich mal eine Randomzahl, aber leider weis ich jetzt nicht, wie ich das Random-Objekt auf meinem Vektor anwende und mir nur bestimmte Elemente rausschreiben lassen kann.

Vielleicht kannst du oder irgendwer helfen

Danke
mfg
iceT


----------



## vites (26. November 2007)

Wir wärs, wenn du es folgendermaßen machst:


```
int n = 6 //Anzahl der Elemente, die du entfernen möchtest.
Random rmd = new Random();
int indexToRem = 0;
String str = "";

for(int i =0; i<n ;i++){
    indexToRem = Math.abs(rmd.nextInt() % vec.size());
    str = (String)list.remove(indexToRem);
    s.replaceAll(str , "____");
}
```

Ich habe die Elemente jeweils aus dem Vector gelöscht, um sicherzustellen, dass keins 2 mal gezogen wird.

Da Vector ein generischer Datentyp ist, solltest du ihn folgendermaßen initialisieren, somit brauchst du auch keine Typcasts:


```
Vector<String> list = new Vector <String>();
```


----------



## iceT18 (29. November 2007)

Hallo,

Super danke hat funktioniert. Hab das ganze etwas abgeändert und so implementiert:


```
int count = Math.abs(rn.nextInt() % vec.size()); 
 
Vector<String> random = new Vector<String>(count);
for (int i = 0; i < count; i++) {
     int ix = rn.nextInt(max - min + 1);
     random.add(vec.get(ix).toString());                  
}
 
String p = sum.getText();
 for (String w : random) {
      p = p.replaceAll(w, "_______");
 }
```
 
Wie kann ich nun noch überprüfen, dass die Elemente nur einmal vorkommen dürfen? D.h. ich mach das add() nur, wenn das Element noch nicht im Vector drinnen ist.

Danke
mfg
iceT


----------



## Florian Strienz (29. November 2007)

Du könntest statt dem Vector ein Hashset benutzen. Da können Elemente immer nur einmal vor kommen.

Alternativ könntest du die addElement Methode des Vectors überschreiben und jedesmal, 

wenn ein Element eingefügt wird, den Vector durchlaufen,
prüfen ob es schon vorhanden ist, 
falls ja, machste nichts, 
falls es nicht vorhanden ist, super.addElement(*INHALT*);

Ich hoffe das Hilft dir weiter.

Gruß
Flo


----------



## vites (29. November 2007)

Nutz einfach die schon vorhandenen Methoden der Klasse Vector. Mit der Methode contains(Object obj) kannst du ganz einfach überprüfen, ob ein Element schon im Vector vorhanden ist.

Also einfach vor dem adden mit contains(Object obj) überprüfen, ob das Element schon vorhanden ist.


----------



## iceT18 (29. November 2007)

Danke, habs jetzt mit "contains()" gemacht. Funktioniert wunderbar!

mfg
iceT


----------

