Lange Rechenzeit.

Status
Nicht offen für weitere Antworten.
F

Fredooo

Gast
Hallo,

habe folgendes Problem: Ich habe eine Methode zum Zählen von Wörtern von großen Textdateien geschrieben,
leider muss mein Rechner sehr lange rumrechnen bis er die Wortanzahl ausspuckt.
Hier is mein Quellcode vielleicht könnt ihr mir ja sagen, wo ich evtl etwas optimieren kann...


Code:
//Methode die prüft ob das jeweilige Zeichen zur "Klasse Wort" gehört
private boolean giltAlsWort (int c)
    {
        if ((c >= (int)'A' && c <= (int)'Z') || (c >= (int)'a' && c <= (int)'z') ||  c == 39 || (c== (int) 'Ä')
             || (c== (int) 'ä') || (c== (int) 'Ö') || (c== (int) 'ö') || (c== (int) 'Ü') || (c== (int) 'ü'))
           return true;
        else return false;
    }
    
public int countWords(String dateiName)
     {  
        boolean test;
        int anzahlWörter = 0; 
        String s = "";
        try {
                FileReader datei = new FileReader(dateiName);
                int c = datei.read();
                
                while (c != -1)
                 { c = datei.read();
                    test = giltAlsWort(c);
                    if (!test) continue;
                    while (test) {
                      s = s + (char) c;
                      c= datei.read();
                      test = giltAlsWort(c); }
                    s = s +" "; } 
               datei.close();
             }
        catch (FileNotFoundException f) {System.out.println( "Datei nicht gefunden!!!"); }
        catch (IOException e) { System.out.println("Error!!!"); }
        
        int anzahl = 0;      
        for (int x = 0; x < s.length(); x++)
         if (s.charAt(x) == ' ') anzahl++; 
        return anzahl;
    }
 

FelixB

Bekanntes Mitglied
Wieso zählst du nicht gleich die Leerzeichen, die nach einem Buchstaben stehen? Dazu musst du doch nicht erst den Dateiinhalt zu einem einzigen String konkatenieren...

übrigens:

das >>s = s + " ";<< dürfte den großen Zeitaufwand verursachen. Nimm lieber erst nen StringBuffer, ist wesentlich flotter...
 
F

Freddoo

Gast
...aber was ist, wenn hinter einem Wort mehrere Leerzeichen oder Absätze etc stehen??
 
F

Fredoo

Gast
...stimmt, das wäre natürlich auch ne Möglichkeit. Gibt es denn nen Befehl im File Reader mit dem ich "rückwärts" lesen kann?
Aber den Code oben, kann man nich mehr wirklich optimieren?
String Buffer wollte ich eigentlich nich benutzen, weil der deprecated is, soweit ich weiß und zB. String.split() liest mir das ganze ja direkt in ein Array ein und das will ich auch nich bzw. soll ich nich!?
Dankeschön schonmal...
 
F

Fredoo nochmal...

Gast
...meinst du denn, dass deine Möglichkeit nach dem Fund eines Leerzeichens immer zu überprüfen ob davor ein Buchstabe steht wirklich schneler is?? Ich muss auch alle Satzzeichen rausfiltern!!
 

Leroy42

Top Contributor
Übrigens:
Code:
//Methode die prüft ob das jeweilige Zeichen zur "Klasse Wort" gehört 
private boolean giltAlsWort (int c) 
    { 
        if ((c >= (int)'A' && c <= (int)'Z') || (c >= (int)'a' && c <= (int)'z') ||  c == 39 || (c== (int) 'Ä') 
             || (c== (int) 'ä') || (c== (int) 'Ö') || (c== (int) 'ö') || (c== (int) 'Ü') || (c== (int) 'ü')) 
           return true; 
        else return false; 
    }

kannst du vereinfachen zu

Code:
//Methode die prüft ob das jeweilige Zeichen zur "Klasse Wort" gehört 
private boolean giltAlsWort (int c) {
  return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||  c == '$' || c== 'Ä' 
             || c=='ä' || c=='Ö' || c== 'ö' || c=='Ü' || c== 'ü';
    }

Oder benutze gleich

Code:
Character.isLetter(c)
 

André B.

Bekanntes Mitglied
Fredoo hat gesagt.:
Gibt es denn nen Befehl im File Reader mit dem ich "rückwärts" lesen kann?
Warum prüfst nicht einfach ob nach deinem Leerzeichen noch ein 2. oder 3. kommt? Sodass du entsprechend diese Leerzeichen einfach überspringst.
Mfg André
 

tini

Bekanntes Mitglied
Fredoo hat gesagt.:
String Buffer wollte ich eigentlich nich benutzen, weil der deprecated is, soweit ich weiß
wo haste denn das her?

Ich nutze StringBuffer fast täglich und der ist von der Performance her einfach wesentlich schneller als Stringkonkatenation mittels "+".
Wenn du mir nicht glaubst, kannst du dir ja mal ein kleines Beispiel mit beiden Varianten basteln (also for-Schleife mit 20.000 Werten und die aneinander reihen - einmal mit +, einmal mit StringBuffer) und die Rechenzeit messen.

Deshalb würde ich dir zum StringBuffer raten, denn da ist massig Potential die Rechenzeit einzuschränken, besonders wenn du schreibst, es soll die Wortzahl großer Texte ausspucken.
 

AlArenal

Top Contributor
StringBuffer ist NICHT deprecated und hat in Java 5 noch Zuwachs durch eine unsynchronisierte Variante, den StringBuilder, erhalten. Letzterer ist nochmal etwas flotter in unterwegs, wenn sichergestellt ist, dass nur aus einem Thread heraus zugegriffen wird,
 
F

Fredoo

Gast
...aber habs jetzt ganz anders gemacht un dso läufts auch echt ziemlich schnell

Code:
static boolean giltAlsZeichen(int c)
    {
        return ( (c >=65 && c <=90) || (c>=97 && c<=122) || c==39 || c=='Ä' 
                  || c=='ä' || c=='Ü' || c=='ü' || c=='Ö' || c=='ö');
    }

static int countWords(String dateiname) throws FileNotFoundException, IOException
    {
        BufferedReader datei = new BufferedReader(new FileReader(dateiname));
        int c = datei.read();
        int words=0;
        boolean vergleich=false;
        while (c != -1)
        {
            if (giltAlsZeichen(zeichen)) {
                if (!vergleich) { words++; vergleich=true; }
            }
            else vergleich=false;
            c=datei.read();
        }
        datei.close();
        return wordsr;
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
berserkerdq2 Lange Variablennamen schlechter Programmierstyle? Java Basics - Anfänger-Themen 4
Devin Wie lange braucht man um Java zu beherrschen und wie kann man es am schnellsten erlernen? Java Basics - Anfänger-Themen 7
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
T Anzeige, wie lange es noch dauert bis ein File gesendet ist. Java Basics - Anfänger-Themen 2
K Wie lange kann / soll das dauern? Java Basics - Anfänger-Themen 6
I HTML Tabelle nur so lange erzeugen bis Höhe erreicht Java Basics - Anfänger-Themen 9
B sehr lange Srings in File schreiben Java Basics - Anfänger-Themen 4
O Löschen lange pfade...Fehler? Java Basics - Anfänger-Themen 1
M Lange Methodenaufrufe == suboptimales Klassendesign? Java Basics - Anfänger-Themen 5
T Android App: Laden dauert lange Java Basics - Anfänger-Themen 1
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
C Wie lange dauert ein Projekt in Java? Java Basics - Anfänger-Themen 10
R Zeit kommt mir zu lange vor... Java Basics - Anfänger-Themen 7
G Socket erstellen dauert sehr lange. Java Basics - Anfänger-Themen 4
hedges Prog braucht lange, schlecht programmiert? Java Basics - Anfänger-Themen 3
H Eingabe so lange wiederholen bis gültiger Wert eingegeben. Java Basics - Anfänger-Themen 7
G Wie lange dauert bei euch das Dateilesen? Java Basics - Anfänger-Themen 18
G Seeehr lange Variablen? Java Basics - Anfänger-Themen 5
J Rechenzeit in Sekunden Java Basics - Anfänger-Themen 3
S Rechenzeit bei Java-programm Java Basics - Anfänger-Themen 6
G jedem while element eine maximale rechenzeit zusichern Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben