Arbeiten mit Vector |
|
Nein, ich nehme dir das nicht krumm, ich kann dabei ja auch noch etwas lernen. Die Map ist wirklich kompakt.
Aber einen kleinen Schwachpunkt hat dein Programm: es wertet bereits die Zeile "*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***" aus. Mein Programm zerlegt erst ab der Zeile danach den Text.
__________________ Syntax Highlighting fürs Board (Link)
|
|
21.07.2013 07:04 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
 |
|
Stimmt.
Die skip-Logik kann man natürlich nach Belieben wieder austauschen.
Eine nennenswerte Änderung war übrigens noch, dass ich den BufferedReader wieder geschlossen habe.
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
21.07.2013 12:53 |
|
|
Lycaner
Eroberer
  
Dabei seit: 17.02.2013
Beiträge: 56
 |
|
Vielen Dank
Man darf doch ein Vector kopieren oder?
Ich habe im Internet diesen Code gefungen
code: |
1:
|
Vector<Zeichenkette> topdatei = new Vector(new_datei); |
|
Ich wollte diesen kopierten Vector nach der Häufigkeit der Wörte sortieren.
Deswegen habe ich in die Klasse von Zeichenkette diese Methode geschrieben
code: |
1:
2:
3:
4:
5:
6:
|
public boolean besserAls(Zeichenkette zweiter) {
if (this.anzahl >= zweiter.anzahl) {
return true;
}
return false;
} |
|
Und dann in die Klasse diese Methode geschrieben um die 5 häufigsten Wörter zu ermitteln
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
|
public void top20(){
Zeichenkette tmp;
Zeichenkette tmp2=new Zeichenkette(null);
for (int i = 0; i < topdatei.size(); i++) {
tmp = this.topdatei.get(i);
if (tmp.besserAls(tmp2)) {
tmp2 = tmp;
topdatei.add(1,tmp2);
}
}
for(int j=0;j<5;j++){
topdatei.elementAt(j).toString();
}
} |
|
Aber irgendwie macht das Programm nicht das, was ich will(
|
|
21.07.2013 18:44 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
 |
|
Wenn es die "Top 5" sein sollen, dann sollte die Methode vielleicht auch "top5" und nicht "top20" heißen – so nebenbei.
Zu Lehrzwecken würde ich dich mal bitten, einfach zu erklären, wie die Methode top20 (bzw. top5) eigentlich funktionieren soll – also einfach nur in Worten. Gefühlt hast du da was geschrieben, ohne genau zu wissen, was du eigentlich schreiben willst.
Außerdem solltest du dir angewöhnen, Probleme detaillierter als "geht nicht" oder "tut nicht, was ich will" zu beschreiben. Was soll es tun, was tut es tatsächlich, wie sehen Input und Output aus, …
Die besserAls-Methode könnte man etwas kürzer auch einfach als
code: |
1:
2:
3:
|
public boolean besserAls(Zeichenkette zweiter) {
return this.anzahl >= zweiter.anzahl;
} |
|
schreiben, wobei ich einwenden möchte, dass das eine "besser als oder gleich gut"-Relation ist, keine "besser als"-Relation.
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Airblader: 21.07.2013 23:21.
|
|
21.07.2013 23:20 |
|
|
Lycaner
Eroberer
  
Dabei seit: 17.02.2013
Beiträge: 56
 |
|
Es sollten 20 Wörter sein aber, weil die Datei zu groß ist, habe ich eine kleine Testdatei gemacht( also alles gelöscht bis zwei Sätze) und es sind weniger Wörter als 20, deswegen auch auf fünf abgeändert.
Zu meinen Gedankengang:
Die Methode besserAls soll true zurückgeben, wenn das erste "Wort" häufiger vorkommt als das zweiten "Wort".
Dann habe ich bei der Methode top20 zwei Variable angelegt. In der zweiten Variabel(tmp2) steht nichts( also "null" und die Zahl ist 1) und die erste Variabel(tmp) wird durch die for-Schleife gefühlt.
Wenn die erste Variabel besser ist als die zweite, dann soll die in der zweiten Variabel gespeichert und gleichzeitig im Vector auf die Position 1 gerückt.
Und wenn der Vector sortiert ist, sollen die ersten fünf "Wörter" ausgegeben werden.
Wenn ich die funktion abrufe, dann bekomme ich diese Meldung
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
und damit kann ich nichts anfangen(
|
|
22.07.2013 08:45 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
 |
|
Wenn man sich einen Algorithmus ausdenkt, sollte man ihn zumindest an ein paar Beispielen mal ausprobieren -- insbesondere an Extremfaellen. Spiele doch mal Schritt fuer Schritt durch, welche Ausgabe zu erwarten waere, wenn topdatei so aussaehe:
topDatei = 10, 2, 3, 4, 5, 6
Es ist uebrigens keine gute Idee, ein Objekt zu veraendern, ueber das du iterierst. Ebenfalls weniger gut ist, dass du Eintraege in topDatei nicht verschiebst, sondern klonst.
Was die Exception verursacht kannst du herausfinden, indem du dir den Stacktrace anschaust und/oder mit dem Debugger in Einzelschritten durch das Programm gehst. Das sind Methoden, die man sich schnell angewoehnen sollte, um nach Fehlern zu suchen. Was das Problem ist sagt "ArrayOutOfBoundsException" ja ganz deutlich, du musst nur noch rausfinden wo und warum dies passiert.
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
22.07.2013 19:05 |
|
|
Lycaner
Eroberer
  
Dabei seit: 17.02.2013
Beiträge: 56
 |
|
Zitat: |
Original von Airblader
Es ist uebrigens keine gute Idee, ein Objekt zu veraendern, ueber das du iterierst. Ebenfalls weniger gut ist, dass du Eintraege in topDatei nicht verschiebst, sondern klonst.
|
Ich habe versuch die Einträge zu verschieben, leider wird der Vector dann immer länger und länger(
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
|
public void top20(){
Zeichenkette tmp;
Zeichenkette tmp2 = new Zeichenkette(null);
for (int j = 0; j < topdatei.size(); j++) {
tmp = this.topdatei.elementAt(j);
if (tmp.größerAls(tmp2)) {
Zeichenkette tmp3 = topdatei.elementAt(j);
topdatei.add(j, tmp2);
topdatei.add((j+1), tmp3);
}
}
} |
|
Oder funktioniert es anders?
|
|
31.07.2013 18:43 |
|
|
|
- Du vergleichst tmp mit tmp2; tmp2 ist aber frisch erstellt und hat keinen nennenswerten Inhalt.
- mit Vector.add fügst du etwas an den Vector dran/ in der Mitte ein. Zum Überschreiben des alten Wertes: Vector.set(index, wert)
- ich nehme an, du willst den Bubblesort implementieren? Da brauchst du zwei verschachtelte Schleifen.
__________________ Syntax Highlighting fürs Board (Link)
|
|
31.07.2013 19:43 |
|
|
Lycaner
Eroberer
  
Dabei seit: 17.02.2013
Beiträge: 56
 |
|
Ok, ich habe das jetzt
Vielen Dank
|
|
31.07.2013 20:19 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
 |
|
Zitat: |
Original von Lycaner
Ich habe versuch die Einträge zu verschieben |
Nochmal: Es ist keine gute Idee, ein Objekt, über das du iterierst, zu verändern. Es führt einfach zu vielen Problemen. Die etwas einfachere Version der Problematik zeigt es vielleicht besser:
code: |
1:
2:
3:
4:
5:
|
int numberOfRuns = 10;
for( int i = 1; i <= numberOfRuns; i++ ) {
numberOfRuns++;
} |
|
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
01.08.2013 10:55 |
|
|
|