我正在尝试自学java。我正在尝试编写一个程序,它接受一个没有空格的字符串并将其分隔成单词。
我的攻击计划是根据字长对字典进行分区,然后通过字符串查找可能的变化。
我遇到了制作词典的问题。我已经阅读了各种集合,我认为持有HashSets的数组(大小为20左右)对我来说效果最好,但我无法弄清楚如何声明它。我认为数组会很好,因为索引代表长度,然后HashSet会很好,因为我可以将这些单词存储为快速查找的键。
在我最熟悉的脚本语言中,我可以在几秒钟内完成这项任务,但我花了大约5个小时阅读并尝试用Java来解决这个问题。从历史上看,这证明我做了一些根本错误的事情。拥有更多java敏锐度的人可以帮助我帮助我吗?
答案 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"
事实上,按照这种逻辑,以i
或a
开头的每个单词最终都会被遗漏。这很糟糕。特别是对于像"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];