选择正确的数据结构

时间:2011-09-30 20:41:22

标签: java arrays data-structures hashset

我正在尝试自学java。我正在尝试编写一个程序,它接受一个没有空格的字符串并将其分隔成单词。

我的攻击计划是根据字长对字典进行分区,然后通过字符串查找可能的变化。

我遇到了制作词典的问题。我已经阅读了各种集合,我认为持有HashSets的数组(大小为20左右)对我来说效果最好,但我无法弄清楚如何声明它。我认为数组会很好,因为索引代表长度,然后HashSet会很好,因为我可以将这些单词存储为快速查找的键。

在我最熟悉的脚本语言中,我可以在几秒钟内完成这项任务,但我花了大约5个小时阅读并尝试用Java来解决这个问题。从历史上看,这证明我做了一些根本错误的事情。拥有更多java敏锐度的人可以帮助我帮助我吗?

4 个答案:

答案 0 :(得分:2)

我不明白你为什么需要一组hashset。这就是我的观点:

Set<String> dictionary = new HashSet<String>();

dictionary.add("One");
dictionary.add("Two");
dictionary.add("Three");
dictionary.add("Four");

以下是我将如何使用它。注意:请不要阅读以下内容,除非您想要实际解决突破性问题。它可能会减少你获得的学习量。所以只有在你被宠坏的时候才能阅读它。

List<String> split(String sentence) {
    List<String> words = new LinkedList<String>();
    String word = ""; // StringBuilder actually is not orders faster in 
                      // this case or I would advocate using it...
    for(int i = 0; i < sentence.length(); i++) {
        word += sentence.charAt(i); // creates a new String anyway, so StringBuilder
                                    // is far less powerful
        if(dictionary.contains(word) {
            words.add(word);
            word = "";
        }
    }
    return words;
}

一些担忧:

让我们假设您的句子和单词都是小写的,以避免区分大小写。 我们还假设您的词典包含每个常用的英语单词。

dictionary.add("this");
dictionary.add("is");
dictionary.add("a");
dictionary.add("test");

并运行“thisisatest”,它将正确分割。

现在,请记住还有其他的话。

dictionary.add("i");
dictionary.add("sat");
dictionary.add("est");

这些都是有效的词。运行它会给你

"this" "i" "sat" "est"

事实上,按照这种逻辑,以ia开头的每个单词最终都会被遗漏。这很糟糕。特别是对于像"apple"这样的字词,您将获得a作为第一个字,然后继续搜索"pple"和以"pple"开头的字词。这会引起很多问题!

即使你可以解决这个问题,你也会遇到问题,而这些问题总是有效的。

考虑“thetreescare”。是“”树“”恐慌“还是”“”树“”关心“。你永远无法做出区分!

所以你选择的问题肯定是个糟糕的!

答案 1 :(得分:1)

如果您唯一的问题是语法,那么要创建一个包含20个HashSet的数组,语法将为:

HashSet[] mySets = new HashSet[20];

答案 2 :(得分:0)

您可能需要以下内容:

HashSet[] dictionary = new HashSet[20];
// Initialize all sets.
for (int i=0; i<dictionary.length; i++) 
{
    dictionary[i] = new HashSet<String>();
}

for (String word: words) // words is array or list with all possible words
{
    dictionary[word.length()].add(word);
}

答案 3 :(得分:0)

HashSet<String>[] mySets = new HashSet[20];