【问题标题】:Java word game queryJava文字游戏查询
【发布时间】:2010-08-30 02:02:13
【问题描述】:

我正在编写一个小应用程序,或多或少有点像文字游戏。 需要验证用户可能创建的单词以检查它是否是有效的英文单词。 我已经想到了一些方法来实现这一点—— 1)有一个哈希图,每个英文单词作为键,布尔值作为值。这样我可以在用户验证时搜索密钥等等。 2) 向dictionary.com 等网站发送HTTP 请求以验证该单词是否存在。

虽然在我看来 HTTP 请求是实现此功能的好方法,但我希望有一个哈希图,它首先被填充,然后定期从源(例如 dictionary.com)更新,这样我就可以避免HTTP 请求实现中涉及的延迟。

任何关于我如何用源代码填充哈希映射的指针将不胜感激。

谢谢 p1nG

【问题讨论】:

    标签: java validation word implementation


    【解决方案1】:

    您可以使用网络服务和 Big Huge Thesaurus。这是一个 REST Web 服务,因此您可能需要 Jersey 或 RestEasy 等工具。

    另一种选择是 Oanaware 及其 SOAP Web 服务。


    资源:

    关于同一主题:

    【讨论】:

      【解决方案2】:

      我认为检查一个单词的哈希是不够的。两个单词可能具有相同的哈希值。此外,字母的随机序列可以具有与正确单词相同的哈希值。考虑到这两点,我认为您将无法避免检查您的单词(在字典中查找)。

      我不确定填满字典的最佳方法是什么。尝试查找免费的词典软件并检查他们的许可证对他们使用的数据的说明。我认为购买this 之类的东西会更容易。

      如果这不是一个选项,我认为在线处理不是一个坏选择。

      【讨论】:

      • 据我了解,当一个集合与具有相同哈希键的 2 个或多个条目发生冲突时,它会遍历每个条目,检查明文键是否匹配。所以我猜想也检查了与集合一起存储的明文密钥。如果我在这里错了,请纠正我。
      • 没错。如果存在哈希冲突,将使用 equals() 方法解决。
      【解决方案3】:

      下载一个单词列表怎么样。您可以使用 WordNet http://wordnet.princeton.edu/wordnet/ 包含 155,287 个单词的列表以及同义词等等。

      或者谷歌搜索类似“英语单词列表”的东西,第一页上有很多相关链接。

      【讨论】:

        【解决方案4】:

        如果您只想检查字典中是否存在单词,为什么不使用 HashSet 呢?您可以使用每行一个单词的纯文本字典文件,或者至少我过去是这样做的。

        不确定是否要更新它,但如果dictionary.com 提供了一个带有单词列表的文件,您可以下载该文件,然后打开该文件并将每个条目添加到您的哈希映射/集。假设不会删除任何单词,则只会覆盖现有条目。

        编辑:刚刚写了一个测试程序,应该证明在检查你的单词时,hashmap 或 hash 集不会出现冲突。

        import java.util.HashSet;
        
        public class CollidingHash {
            String value;
            public CollidingHash(String s){
                value=s;
            }
            @Override 
            public int hashCode(){
                return 1;
            }
            @Override 
            public boolean equals(Object o){
                if(! (o instanceof CollidingHash)){
                    return false;
                }
                CollidingHash c2 = (CollidingHash)o;
                return value.equals(c2.value);
            }
            public static void main(String[] args) {
                HashSet<CollidingHash> dict = new HashSet<CollidingHash>();
                CollidingHash a = new CollidingHash("This");
                CollidingHash b = new CollidingHash("That");
                dict.add(a);
                System.out.println("Is "+ (dict.contains(b)? "Bad": "OK"));
            }   
        }
        

        Edit2:添加了 Pace 提到的 equals 方法。

        【讨论】:

          【解决方案5】:

          1) 每个英语都有一个 hashmap word 作为键,布尔值作为值。 这样我就可以在 用户验证时间等等。

          HashMap 对于这个任务来说太过分了。你只需要知道一个词是否存在,所以你可以使用HashSet。将所有单词添加到HashSet 后,您将使用contains() 方法检查HashSet 中是否存在单词。但您必须注意这是区分大小写的方法,因此您必须确保所有单词的大小写相同(例如,“hello”与“Hello”不匹配)。

          另外,我不知道将整个英语词典加载到内存中会占用多少内存。如果遇到问题,更好的方法可能是每次需要检查单词是否存在时扫描字典文件。

          2) 向某个站点发送 HTTP 请求 像 dictionary.com 来验证是否 单词存在与否。

          这也可以,但它依赖于 (1) 计算机具有有效的 Internet 连接和 (2) dictionary.com 网站正在运行。

          【讨论】:

            猜你喜欢
            • 2015-06-12
            • 2020-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多