2009-08-23 4 views
0

Implementiert einen lexikalischen Scanner. Wie kann ich Zeichensätze implementieren? die meisten Zeichensätze liegen in der Bereichsform, d. h. A-Z, h-L e.t.c. Und ich muss prüfen, ob ein Zeichen, ch ein Mitglied eines Zeichensatzes ist. Welche effiziente Datenstruktur kann ich in Java außer Arrays und Bit Set verwenden?Zeichensätze

Antwort

0

Sie könnten einen Satz von Zeichenobjekten erstellen und mit der contains-Methode überprüfen.

2

Haben Sie in Betracht gezogen, einen Scannergenerator wie JFlex zu verwenden?
Sie geben die Sprache an, die Sie scannen möchten, und JFlex erzeugt Java-Code für Sie.

2

eine HashSet zusammen mit dem "wrapper class" für char Verwendung: java.lang.Character:

Set<Character> s = new HashSet<Character>(); 
s.add('a'); 
s.add('b'); 

usw.

0

Sie HashSet direkt verwenden können, oder Sie können eine Wrapper-Klasse so etwas wie die folgenden erstellen, damit Sie die Sätze kurz und bündig instanziieren:

public class MyCharSet extends Set<Character> { 
    /** 
    * @param ranges an N x 2 array representing inclusive character ranges. 
    */ 
    public MyCharSet(char[][] ranges) { 
     super(intuitSize(ranges)); 
     for (char[] range : ranges) { 
      for (char ch = range[0]; ch <= range[1]; ch++) { 
       this.add(ch); 
      } 
     } 
    } 

    private static int intuitSize(char[][]ranges) { 
     if (ranges.length == 0) { 
      return 0; 
     } 
     int min = Integer.MAX_VALUE; 
     int max = Integer.MIN_VALUE; 
     for (char[] range : ranges) { 
      if (range.length != 2 || range[0] > range[1]) { 
       throw new IllegalArgumentException("bad range"); 
      } 
      min = Math.min(ranges[0], min); 
      max = Math.max(ranges[1], max); 
     } 
     return max - min; 
    } 
} 
Verwandte Themen