0

我正在编写一个词法分析器并且从未使用过哈希集。我想拿一个字符串并确保它是合法的。我想我了解如何使用有效字符构建散列集,但我不确定如何将字符串与散列集进行比较以确保它包含有效字符。我在任何地方都找不到示例。有人可以指出我可以做到这一点的代码吗?

4

3 回答 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 回答