字符集

时间:2009-08-23 20:38:50

标签: java

实施词汇扫描仪。我该如何实现字符集?大多数字符集将是范围形式,即A-Z,h-L e.t.c.我必须检查一个字符ch是否是字符集的成员。除了数组和位集之外,我可以在Java中使用哪种高效的数据结构?

6 个答案:

答案 0 :(得分:2)

您是否考虑使用JFlex之类的扫描仪生成器? 您可以指定要扫描的语言,JFlex会为您生成Java代码。

答案 1 :(得分:2)

HashSetchar的“包装类”一起使用:java.lang.Character

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

答案 2 :(得分:1)

Apache Commons Lang包含CharRange类,它有效地表示连续的字符范围,而不需要求助于循环,迭代器和集合。

答案 3 :(得分:0)

您可以创建一组Character对象并使用contains方法进行检查。

答案 4 :(得分:0)

你看过ANTLR吗?

答案 5 :(得分:0)

您可以直接使用HashSet,或者您可以创建类似于以下内容的包装类,以允许您更简洁地实例化这些集:

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