derletztekick: RegExp-Geschwindigkeit

Beitrag lesen

Hallo Ihr zwei,

nun, da der String aus einer Datei eingelsen wird, wird wohl das pure Einlesen bereits viel mehr Zeit in Anspruch nehmen als das Trennen selbst.

Vll hätte ich etwas weiter ausholen sollen? Ich habe mir bei verschiedenen Programmen angesehen, wie die mehrere Sprachen anbieten und bin auf solche Sprachdateien gestoßen. Allg. Aufbau sieht so aus:

  
[Menu]  
0=Datei  
1=Einstellungen  
2=?  
  
[File]  
0=Öffnen  
1=Beenden

Es existiert also eine Art Kategorie, gefolgt von Unterpunkten. Ich lese nun als jede Zeile ein und bearbeite diese, sofern sie in das Kategorie- oder Unterpunktmuster passt und steck sie in eine Hashtable. Das sieht dann "bildlich" so aus:

ht = [[Menu, [0, Datei]
             [1,Einstellungen]
             [2,?]],
      [File, [0, Öffnen]
             [1,Beenden]]
     ]

Da die Indizes nicht in folge kommen müssen oder nicht Null am Anfang sind, stecken auch die Unterpunkte in so einer Tabelle, sodass ich einen Eintrag über die beiden Schlüssel bekomme.

  
      String category = null;  
      Hashtable<Integer, String> entries = new Hashtable<Integer, String>();  
      while ((line = br.readLine()) != null) {  
        if (line.trim().length() != 0) {  
          if (line.matches("\\[(.+?)\\]")) {  
            if (category != null && category.length() > 0 && !this.ht.containsKey(category) && entries.size() > 0) {  
              this.ht.put(category, entries);  
              entries = new Hashtable<Integer, String>();  
            }  
            category = line.replaceAll("\\[(.+?)\\]", "$1");  
          }  
  
          else if (line.matches("^([0-9]+)=(.+)")) {  
            entries.put(Integer.parseInt(line.replaceAll("^([0-9]+)=(.+)", "$1")), line.replaceAll("^([0-9]+)=(.+)", "$2"));  
          }  
        }  
      }  
      if (category != null && category.length() > 0 && !this.ht.containsKey(category) && entries.size() > 0)  
        this.ht.put(category, entries);

Mit freundlichem Gruß
Micha