我试图从包含许多单词的一个很长的字符串中提取单词作为字符串。我正在尝试使用这个字符串的大块,使用for循环遍历它,构建字符串,将它们添加到hashset,并跟踪我在这个过程中有多少单词。当我完成所有内容并且eclipse没有显示任何明显错误时,我非常自豪,然后当我去测试它时,我有一个0计数器,0 hashset.size和一个空的hashset :(
以下是我一直在捏造的代码:
public int countUniqueWords(String line) {
hashset = new HashSet<String>();
word = new StringBuilder();
int endOfLine = line.length() - 1;
boolean isWord = false;
String stringWord = null;
Integer counter = 0;
for (int i = 0; i < line.length(); i++) {
if (Character.isLetter(line.charAt(i)) == true && i != endOfLine) {
word.append(line.charAt(i));
} else if (Character.isLetter(line.charAt(i)) == false && isWord == true) {
counter++;
stringWord = word.toString();
hashset.add(stringWord);
word = null;
isWord = false;
} else if (Character.isLetter(line.charAt(i)) && i == endOfLine) {
counter++;
stringWord = word.toString();
hashset.add(stringWord);
}
}
System.out.println(counter);
System.out.println(hashset.size());
System.out.println(hashset);
return counter;
}
我将继续搜索并踢出轮胎。与此同时,如果有人有任何建议,我会在我的小家庭办公室里给你奖励很多精神上的好感。看起来我在这里至少有一两个非常基本的错误,因为很明显它甚至不像它应该的那样迭代循环。我怀疑它与我使用StringBuilder以及HashSets和Character类有关,所有这些都被捣碎在一起,而不是特别理解这些。是的,我已经倾倒了oracle文档。
答案 0 :(得分:1)
第一个条件适用于所有字符
if (Character.isLetter(line.charAt(i)) == true && i != endOfLine)
第二个条件总是为false,因为isWord为false,条件下的语句永远不会执行
else if (Character.isLetter(line.charAt(i)) == false && isWord == true)
第三个条件永远不会执行,因为这与第一个条件相同
else if (Character.isLetter(line.charAt(i)) && i == endOfLine)
您需要在需要时打开/关闭'isWord'标志来更改条件。
答案 1 :(得分:0)
尝试这种方法......
- 使用BreakIterator
中的java.text.BreakIterator
及其static getWordInstance()
方法来保留句子中的所有字词。
- 这会自动处理这个词或不是......
- 然后只需将其添加到HashSet<String>
请参阅以下链接:
http://javabeanz.wordpress.com/2009/02/21/working-with-text-in-java-using-breakiterator-api/
http://download.java.net/jdk7/archive/b123/docs/api/java/text/BreakIterator.html
http://www.javadocexamples.com/java/text/BreakIterator/getWordInstance%28Locale%20where%29.html