Arbeiten mit Vector |
19.07.2013, 14:41 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Arbeiten mit Vector Hi, ich muss wieder in Java ein Programm schreiben und komme wieder nicht weiter. Die Aufgabenstellung ist, schreiben sie ein Programm, dass aus einer Datei einen Textabschnitt einliest. Dann alle Satzzeichen entfernt und die Wörter sortiert. Bis jetzt habe ich folgendes geschrieben:
Wie kann ich die einzelnen Wörter zu meinem Vector zufügen? |
|||||||||||||||
|
||||||||||||||||
19.07.2013, 14:53 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl |
In anderen Sprachen findet man dieses Konstrukt auch als foreach. Es ist speziell zum Durchlaufen von arrays, alternativ ginge es natürlich auch mit einer normalen for Schleife. |
|||||||||||||||
19.07.2013, 19:43 | Auf diesen Beitrag antworten » | |||||||||||||||
Airblader | Denkbar wäre auch
Zu der von eulersche Zahl vorgeschlagenen "enhanced for-loop" (die hier übrigens durchaus genauso geeignet und gebräuchlich ist) würde ich noch anmerken, dass sie nicht nur für Arrays möglich ist, sondern auch für Collections (also Listen, Vektoren, …). |
|||||||||||||||
19.07.2013, 21:40 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Collections.addAll kannte ich noch nicht, danke für den Tipp.
Du willst die Wörter nur dann an den Vector hängen, wenn die Zeile "START OF THIS PROJECT..." beinhaltet? Ist das wirklich so beabsichtigt? |
|||||||||||||||
Anzeige | ||||||||||||||||
|
||||||||||||||||
20.07.2013, 09:09 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Nein, es ist ein langer Text aber ich muss nur den Abschnitt bearbeiteten, der zwischen der Zeile "*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA *** und *** END OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***. Deswegen dachte ich, ich lese den ganze Text ein und zerlege nur den Teil, den ich brauche in einzelnen Wörter oder geht es so nicht? |
|||||||||||||||
20.07.2013, 11:29 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Bisher zerlegst du nur die eine Zeile, die den Start markiert. Du brauchst eine Variable, in der du dir merkst, ob die Startzeile schon vorkam. Wenn diese Variable auf true ist, dann kannst du zerlegen: Code nicht getestet:
|
|||||||||||||||
20.07.2013, 12:02 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Danke, ich wollte testen, ob das Programm bis dahin läuft aber bekomme immer die Meldung Datei pg2499 konnte nicht gelesen werden! So sieht mein Main aus. Die Textdatei (typ:textdokument)heißt pg2499 liegt auch in dem Ordner, wo der Projekt liegt. Was kann man noch falsch machen?
|
|||||||||||||||
20.07.2013, 16:53 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Du musst den absoluten Pfad angeben: entweder so
oder so, um das Verzeichnis zu ermitteln, in dem das Projekt sich befindet:
|
|||||||||||||||
20.07.2013, 18:07 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Oh man ein Problemm weg, dazu kommen zwei neu( Ich muss diese Vector alphabetisch sortieren und wenn ein Wort doppelt vorkommt, soll der Zähler für den Wort um eins steigen. Deswegen habe ich eine neue Klasse eingeführt
Dann habe ich den Vector angepasst
Aber jetzt funktionier das zufügen von String nicht mehr(
Und noch eine Frage, bei der Funktion equals, woher weiß ich welcher String zu erst kommt? |
|||||||||||||||
20.07.2013, 18:40 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl |
-umständlich -was, wann ein anderes Zeichen vorkommt? -was, wenn das Zeichen nicht am Ende steht, z.B. bei Anführungsstrichen? mein Vorschlag:
Zum Sortieren: schreibe eine Funktion compareTo(Zeichenkette vergleich) in die Klasse Zeichenkette (vergleich darf auch anders heißen, sonst genau diesen Kopf). Dann kannst du das Sortieren mit Collections.sort() machen. Wenn dein Vector den Typ Zeichenkette hat, musst du auch eine Zeichenkette hinzufügen, keinen String.
spielt es denn eine Rolle, ob string1 == string2 ist oder string2 == string1? Aber der erstgenannte string ist der, für den die Funktion zur Gleichheitsprüfung aufgerufen wird. |
|||||||||||||||
20.07.2013, 19:31 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Dumme Frage Wenn ich jetzt eine Funktion in die Klasse Zeichenkette schreibe und der Funktion nur ein Objekt übergebe, wie kann ich es dann sortieren? Ich mein z.B Zeichenkette xy= new Zeichenkette("der"); also hat der Objekt xy nur ein String "der" und eine zahl =1 Wie kann ich hier etwas sortieren? |
|||||||||||||||
20.07.2013, 19:35 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl |
|
|||||||||||||||
20.07.2013, 21:02 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Das ist nicht genau, dass was ich brauche. Weil ich nicht nur den Vector sortieren muss, sondern auch die Wörter zählen muss, wie oft die vorkommen. |
|||||||||||||||
20.07.2013, 21:10 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Das Einrücken des Quellcodes sah bei mir in eclipse anders aus
|
|||||||||||||||
20.07.2013, 23:16 | Auf diesen Beitrag antworten » | |||||||||||||||
Airblader | eulerscheZahls Programm ist natürlich vollkommen in Ordnung und ich hoffe, er nimmt es mir nicht böse, wenn ich meine Alternative dazu einstelle (irgendwas muss man ja tun, während die Freundin im Bad ist…). Insbesondere verwende ich keine eigene Klasse, sondern eine TreeMap, die für genau sowas geschaffen ist. Dann muss ich mir um das (alphabetische!) Sortieren keine Gedanken machen – wenn ich nach Anzahl der Vorkommen sortieren will, dann natürlich schon. Das basiert auf der Annahme, dass die Verwendung von Vector nicht Pflicht war. Ansonsten habe ich bei mir auch alles auf Englisch gemacht, weil das zum Einen üblich ist, zum anderen mage ich es nicht, zwei Sprachen zu mischen ("line" versus "woerter"). Und ein paar Dinge habe ich natürlich ein klein wenig anders aufgezogen. Wie gesagt, alles nur um vielleicht mal zu sehen, dass man sowas auf verschiedene Arten lösen kann.
|
|||||||||||||||
21.07.2013, 07:04 | Auf diesen Beitrag antworten » | |||||||||||||||
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. |
|||||||||||||||
21.07.2013, 12:53 | Auf diesen Beitrag antworten » | |||||||||||||||
Airblader | 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. |
|||||||||||||||
21.07.2013, 18:44 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Vielen Dank Man darf doch ein Vector kopieren oder? Ich habe im Internet diesen Code gefungen
Ich wollte diesen kopierten Vector nach der Häufigkeit der Wörte sortieren. Deswegen habe ich in die Klasse von Zeichenkette diese Methode geschrieben
Und dann in die Klasse diese Methode geschrieben um die 5 häufigsten Wörter zu ermitteln
Aber irgendwie macht das Programm nicht das, was ich will( |
|||||||||||||||
21.07.2013, 23:20 | Auf diesen Beitrag antworten » | |||||||||||||||
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
schreiben, wobei ich einwenden möchte, dass das eine "besser als oder gleich gut"-Relation ist, keine "besser als"-Relation. |
|||||||||||||||
22.07.2013, 08:45 | Auf diesen Beitrag antworten » | |||||||||||||||
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( |
|||||||||||||||
22.07.2013, 19:05 | Auf diesen Beitrag antworten » | |||||||||||||||
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. |
|||||||||||||||
31.07.2013, 18:43 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner |
Ich habe versuch die Einträge zu verschieben, leider wird der Vector dann immer länger und länger(
Oder funktioniert es anders? |
|||||||||||||||
31.07.2013, 19:43 | Auf diesen Beitrag antworten » | |||||||||||||||
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. |
|||||||||||||||
31.07.2013, 20:19 | Auf diesen Beitrag antworten » | |||||||||||||||
Lycaner | Ok, ich habe das jetzt Vielen Dank |
|||||||||||||||
01.08.2013, 10:55 | Auf diesen Beitrag antworten » | |||||||||||||||
Airblader |
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:
|
|