我正在编写一个词法分析器并且从未使用过哈希集。我想拿一个字符串并确保它是合法的。我想我了解如何使用有效字符构建散列集,但我不确定如何将字符串与散列集进行比较以确保它包含有效字符。我在任何地方都找不到示例。有人可以指出我可以做到这一点的代码吗?
问问题
25425 次
3 回答
2
HashSet 对此具有 contains() 函数,因为它实现了 Collection 接口。
于 2013-11-10T02:19:52.900 回答
2
您不能将整个字符串与 a 进行比较HashSet<Character>
,但您可以一次一个字符进行比较:
HashSet<Character> valid = new HashSet<Character>();
valid.add('a');
valid.add('d');
valid.add('f');
boolean allOk = true;
for (char c : "fad".toCharArray()) {
if (!valid.contains(c)) {
allOk = false;
break;
}
}
System.out.println(allOk);
但是,这不是最有效的方法。更好的方法是使用您需要的字符构造一个正则表达式,然后调用match()
字符串:
// Let's say x, y, and z are the valid characters
String regex = "[xyz]*";
if (myString.matches(regex)) {
System.out.println("All characters in the string are in 'x', 'y', and 'z'");
}
于 2013-11-10T02:20:59.590 回答
1
我想你可能是在想这个问题。(例如,花太多时间思考如何使词法分析器“高效”......)
在词法分析器中测试有效/无效字符的常规方法是:
使用大的 switch 语句,或
执行一系列“字符类”测试;例如使用结果
Character.getType(char)
或者更好的是,使用词法分析器生成器。
使用 HashSet 并不比switch
. 并且“字符类”方法可能比两者都更具可读性......取决于您的验证规则。
但如果我还没有说服你,请参阅@blinkenlights 的回答 :-)
于 2013-11-10T02:25:10.367 回答