Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Arbeiten mit Vector (http://www.informatikerboard.de/board/thread.php?threadid=1554)


Geschrieben von Lycaner am 19.07.2013 um 14:41:

  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:

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?



Geschrieben von eulerscheZahl am 19.07.2013 um 14:53:

 

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.



Geschrieben von Airblader am 19.07.2013 um 19:43:

 

Denkbar wäre auch

code:
1:
Collections.addAll(new_datei, woerter);


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, …).



Geschrieben von eulerscheZahl am 19.07.2013 um 21:40:

 

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



Geschrieben von Lycaner am 20.07.2013 um 09:09:

 

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?



Geschrieben von eulerscheZahl am 20.07.2013 um 11:29:

 

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:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
String line = null;
boolean zerlegen = false;    //zu Beginn wird nicht zerlegt			
while ((line = br.readLine()) != null) {
	if(zerlegen){ //wenn bereits START OF PROJECT... vorkam
		//hier musst du in line noch Satzzeichen entfernen
		String woerter[] =line.split(" "); 
		Collections.addAll(new_datei, woerter);
	}
    if (line.contains("*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***"))
    	zerlegen = true;
    if (line.contains("*** END OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***"))
        break;
}



Geschrieben von Lycaner am 20.07.2013 um 12:02:

 

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?
code:
1:
2:
3:
4:
5:
6:
 public static void main(String[] args) {
           Klasse text = new Klasse();
           text.leseDaten("pg2499");
      }



Geschrieben von eulerscheZahl am 20.07.2013 um 16:53:

 

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");



Geschrieben von Lycaner am 20.07.2013 um 18:07:

 

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?



Geschrieben von eulerscheZahl am 20.07.2013 um 18:40:

 

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.



Geschrieben von Lycaner am 20.07.2013 um 19:31:

 

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?



Geschrieben von eulerscheZahl am 20.07.2013 um 19:35:

 

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 :)
    }
}



Geschrieben von Lycaner am 20.07.2013 um 21:02:

 

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.



Geschrieben von eulerscheZahl am 20.07.2013 um 21:10:

 

Das Einrücken des Quellcodes sah bei mir in eclipse anders aus traurig
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:
82:
83:
84:
85:
86:
87:
88:
89:
90:
public class Zeichenkette implements Comparable<Zeichenkette>{
      String zeichenkette;
      int anzahl;
    public Zeichenkette(String zeichenkette){
        this.zeichenkette = zeichenkette;
        anzahl = 1;
    }
    
    @Override
    public String toString(){
    	return this.zeichenkette + "   " + anzahl;
    }
    
    public int compareTo(Zeichenkette vergleich){
    	return this.zeichenkette.compareToIgnoreCase(vergleich.zeichenkette);
    }
    
    public boolean equals(String s){
    	return this.zeichenkette.equalsIgnoreCase(s);    	
    }

	public void increment() {
		this.anzahl++;
	}
}




public class Klasse {

    Vector<Zeichenkette> new_datei = new Vector<Zeichenkette>();

    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 (line.contains("*** END OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***")) {
            	   break;
               }
               if (zerlegen) {
					line = line.replaceAll("[^A-Za-z ]", "");
					String woerter[] = line.split(" "); 
					for(String wort : woerter){
                        int index;
                        for(index = 0; index < new_datei.size(); index++){
                        	if (new_datei.elementAt(index).equals(wort)) {
                        		break;                      	
                        	}
                        }
						if (index == new_datei.size()) new_datei.add(new Zeichenkette(wort));
						else new_datei.elementAt(index).increment();
					}

                }
                if (line.contains("*** START OF THIS PROJECT GUTENBERG EBOOK SIDDHARTHA ***")) {
                    zerlegen = true;
                }
            }
        } 
        catch (IOException e) {
            System.out.println("Datei " + dateiname + " konnte nicht gelesen werden!");
        }
        Collections.sort(new_datei);
    }

	public void schreibe() {
		for(Zeichenkette z : new_datei)
			System.out.println(z);
	}

}




public class main {
	public static void main(String[] args)
	{
		Klasse k = new Klasse();
		k.leseDaten(System.getProperty("user.dir") + "\\datei.txt");
		k.schreibe();
	}
}



Geschrieben von Airblader am 20.07.2013 um 23:16:

 

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();
    }

}


Forensoftware: Burning Board, entwickelt von WoltLab GmbH