Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Arbeiten mit Vector » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
Airblader

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++;
}
Lycaner

Ok, ich habe das jetzt
Vielen Dank
eulerscheZahl

- 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.
Lycaner

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?
Airblader

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.
Lycaner

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(
Airblader

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.
Lycaner

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(
Airblader

Stimmt. smile

Die skip-Logik kann man natürlich nach Belieben wieder austauschen.

Eine nennenswerte Änderung war übrigens noch, dass ich den BufferedReader wieder geschlossen habe.
eulerscheZahl

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.
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.