Arbeiten mit Vector |
Lycaner
Eroberer
![](images/star.gif) ![](images/star.gif) ![](images/star.gif)
Dabei seit: 17.02.2013
Beiträge: 56
![](images/spacer.gif) |
|
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:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
public void leseDaten(String dateiname) {
Vector new_datei=new Vector();
File Datei = new File(dateiname);
try {
BufferedReader br = new BufferedReader(new FileReader(Datei));
String line = null;
while ((line = br.readLine()) != null) {
if(line.contains("*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***")){
String woerter[] =line.split(" ");
new_datei.add(woerter[]); /***Wie kann ich hier die einzelne Wörter dem Vector zuführen?***/
}
if(line.contains("*** END OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***"))
break;
}
} catch (IOException e) {
System.out.println("Datei " + dateiname + " konnte nicht gelesen werden!");
}
}
}
|
|
Wie kann ich die einzelnen Wörter zu meinem Vector zufügen?
|
|
19.07.2013 14:41 |
|
|
|
code: |
1:
2:
3:
|
for (String wort: woerter) {
new_datei.add(wort);
} |
|
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.
__________________ Syntax Highlighting fürs Board (Link)
|
|
19.07.2013 14:53 |
|
|
|
Collections.addAll kannte ich noch nicht, danke für den Tipp.
code: |
1:
2:
3:
|
if(line.contains("*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***")){
//Wörter an Array anfügen
} |
|
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?
__________________ Syntax Highlighting fürs Board (Link)
|
|
19.07.2013 21:40 |
|
|
Lycaner
Eroberer
![](images/star.gif) ![](images/star.gif) ![](images/star.gif)
Dabei seit: 17.02.2013
Beiträge: 56
![](images/spacer.gif) |
|
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 09:09 |
|
|
|
Du musst den absoluten Pfad angeben:
entweder so
code: |
1:
|
leseDaten("C:\\unterordner\\datei.txt"); |
|
oder so, um das Verzeichnis zu ermitteln, in dem das Projekt sich befindet:
code: |
1:
|
leseDaten(System.getProperty("user.dir") + "\\datei.txt"); |
|
__________________ Syntax Highlighting fürs Board (Link)
|
|
20.07.2013 16:53 |
|
|
Lycaner
Eroberer
![](images/star.gif) ![](images/star.gif) ![](images/star.gif)
Dabei seit: 17.02.2013
Beiträge: 56
![](images/spacer.gif) |
|
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
code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
public class Zeichenkette {
String zeichenkette;
int anzahl;
public Zeichenkette(String zeichenkette){
this.zeichenkette=zeichenkette;
anzahl=1;
} } |
|
Dann habe ich den Vector angepasst
code: |
1:
2:
|
Vector<Zeichenkette> new_datei = new Vector(); |
|
Aber jetzt funktionier das zufügen von String nicht mehr(
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
|
public class Klasse {
Vector<Zeichenkette> new_datei = new Vector();
public void leseDaten(String dateiname) {
File Datei = new File(dateiname);
try {
BufferedReader br = new BufferedReader(new FileReader(Datei));
String line = null;
boolean zerlegen = false;
while ((line = br.readLine()) != null) {
if (zerlegen) {
String woerter[] = line.split(" ");
for (int i = 0; i < woerter.length; i++) {
String wort = woerter[i];
if (wort.charAt(wort.length() - 1) == '.'
|| wort.charAt(wort.length() - 1) == ','
|| wort.charAt(wort.length() - 1) == '?'
|| wort.charAt(wort.length() - 1) == '!'
|| wort.charAt(wort.length() - 1) == ';'
|| wort.charAt(wort.length() - 1) == ':') {
wort = wort.substring(0, wort.length() - 1);
}
wort = wort.toLowerCase();
new_datei.add(wort);
}
if (line.contains("*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***")) {
zerlegen = true;
}
if (line.contains("*** END OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***")) {
break;
}
}
}
} catch (IOException e) {
System.out.println("Datei " + dateiname + " konnte nicht gelesen werden!");
}
}
public void sortieren(Vector<Zeichenkette> new_datei) {
for (int i = 0; i < new_datei.size(); i++) {
Zeichenkette tem = null;
Zeichenkette tem2 = new_datei.get(i);
if (tem.equals(tem2)) {
tem.anzahl++;
}
/* if (tem.equals(tem2)) {
Zeichenkette tem3 = tem;
tem = tem2;
tem2 = tem3;
}*/
}
}
} |
|
Und noch eine Frage, bei der Funktion equals, woher weiß ich welcher String zu erst kommt?
|
|
20.07.2013 18:07 |
|
|
|
code: |
1:
2:
3:
4:
5:
6:
7:
|
if (wort.charAt(wort.length() - 1) == '.'
|| wort.charAt(wort.length() - 1) == ','
|| wort.charAt(wort.length() - 1) == '?'
|| wort.charAt(wort.length() - 1) == '!'
|| wort.charAt(wort.length() - 1) == ';'
|| wort.charAt(wort.length() - 1) == ':') {
wort = wort.substring(0, wort.length() - 1); |
|
-umständlich
-was, wann ein anderes Zeichen vorkommt?
-was, wenn das Zeichen nicht am Ende steht, z.B. bei Anführungsstrichen?
mein Vorschlag:
code: |
1:
2:
|
line = line.replaceAll("[^A-Za-z ]", ""); //löscht alles außer Buchstaben und Leerzeichen
String woerter[] = line.split(" "); |
|
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.
Zitat: |
Und noch eine Frage, bei der Funktion equals, woher weiß ich welcher String zu erst kommt? |
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.
__________________ Syntax Highlighting fürs Board (Link)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 20.07.2013 18:41.
|
|
20.07.2013 18:40 |
|
|
Lycaner
Eroberer
![](images/star.gif) ![](images/star.gif) ![](images/star.gif)
Dabei seit: 17.02.2013
Beiträge: 56
![](images/spacer.gif) |
|
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:31 |
|
|
|
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
Collections.sort(new_datei); //fertige Sortierfunktion, verwendet compareTo() der Klasse Zeichenkette
public class Zeichenkette implements Comparable<Zeichenkette>{ //Instanzen der Klasse können vergleichen werden
//...
public int compareTo(Zeichenkette vergleich){ //mit dieser Funktion
return this.zeichenkette.compareToIgnoreCase(vergleich.zeichenkette); //lässt die eigentliche Arbeit von der Klasse String erledigen, da ich faul bin :)
}
} |
|
__________________ Syntax Highlighting fürs Board (Link)
|
|
20.07.2013 19:35 |
|
|
Lycaner
Eroberer
![](images/star.gif) ![](images/star.gif) ![](images/star.gif)
Dabei seit: 17.02.2013
Beiträge: 56
![](images/spacer.gif) |
|
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:02 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
![](images/spacer.gif) |
|
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.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
|
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
public class WordCounter {
private static Map<String, Integer> countedWords = new TreeMap<String, Integer>();
private static void putWordIntoMap( String word ) {
String lowercaseWord = word.trim().toLowerCase();
// we don't want to count spaces
if( lowercaseWord.isEmpty() ) {
return;
}
int currentCount = 0;
if( countedWords.containsKey( lowercaseWord ) ) {
currentCount = countedWords.get( lowercaseWord );
}
countedWords.put( lowercaseWord, currentCount + 1 );
}
public static void readData (String filename) {
countedWords.clear();
File file = new File( filename );
BufferedReader reader = null;
try {
reader = new BufferedReader( new FileReader( file ) );
String line;
boolean skipLine = true;
while( ( line = reader.readLine() ) != null ) {
skipLine &= !line.contains( "*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***" );
if( skipLine ) {
continue;
}
if( line.contains( "*** END OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***" ) ) {
break;
}
line = line.replaceAll( "[^A-Za-z ]", "" );
String words[] = line.split( " " );
for( String word : words ) {
putWordIntoMap( word );
}
}
} catch( IOException e ) {
System.out.println( "Could not read file " + filename );
} finally {
try {
reader.close();
} catch ( IOException e ) {
System.out.println( "Exception while closing reader" );
}
}
}
public static void writeData() {
for( Map.Entry<String, Integer> entry : countedWords.entrySet() ) {
System.out.println( entry.getValue() + " : " + entry.getKey() );
}
}
public static void main( String[] args ) {
readData( "resources/datei.txt" );
writeData();
}
} |
|
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
20.07.2013 23:16 |
|
|
|