实施词汇扫描仪。我该如何实现字符集?大多数字符集将是范围形式,即A-Z,h-L e.t.c.我必须检查一个字符ch是否是字符集的成员。除了数组和位集之外,我可以在Java中使用哪种高效的数据结构?
答案 0 :(得分:2)
您是否考虑使用JFlex之类的扫描仪生成器? 您可以指定要扫描的语言,JFlex会为您生成Java代码。
答案 1 :(得分:2)
将HashSet
和char
的“包装类”一起使用: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;
}
}