【问题标题】:how to get words from a sequence of characters in java?如何从java中的字符序列中获取单词?
【发布时间】:2012-06-20 20:21:18
【问题描述】:

我有一个 getNextChar() 方法,它逐个字符地读取字符串。我正在编写一个方法来获取 getNextChar() 提供的字符序列中的单词。

文本包含标点符号和其他特殊字符。

我想有一个包含所有标点符号和特殊字符的数组,当我读取文本的字符时,检查字符是否在数组中以忽略它。 该方法将在获得空格时识别该单词。 单词将存储在集合中(例如:地图),因为我还需要通过检查该单词之前是否已在地图中插入并增加来计算频率那个词的计数器。

  1. 这是最好且高效的方法吗?我正在寻找最有效的方法。一个
  2. 是否有标点符号和特殊字符的完整列表

【问题讨论】:

  • 您一次只获取一个字符吗?或者你一次只得到一个字符串,而你只是选择字符迭代,因为你认为这是找到断字的最好方法?
  • docs.oracle.com/javase/1.4.2/docs/api/java/util/… 这可能可以做你想做的事情
  • 我一次得到一个字符,直到没有更多字符时我得到 EOFException。
  • 标点符号和特殊字符列表有助于了解您正在处理的语言。

标签: java string parsing character


【解决方案1】:

我认为有一种更简单的方法可以做到这一点。

无论您的输入源是什么,我都会使用 Scanner 类来读取它。您可以使用输入字符串实例化此类并调用 Scanner.nextWord() 方法以获取字符串中的下一个单词。这会自动检查空格并返回下一个单词。然后,您可以使用 String.replace("punctuation","") 删除标点符号,然后将这些单词插入到 ArrayList 中,您可以计算频率等。

Scanner reader = new Scanner(string);
String word = reader.nextWord();
word=word.replaceAll(//code);
list.add(word);

【讨论】:

  • 您还可以使用usePattern() 更改扫描仪的分隔符模式以匹配任何空格或单词分隔标点符号序列(注意不要包含连字符)
  • 好主意,这将有助于提高特异性
【解决方案2】:

您可以使用 string.split() 将字符串拆分为由空格分隔的字符串数组(用于您的单词。)您还可以使用 Character.isLetterOrDigit() 检查每个字符以避免标点符号。 (不一定按这个顺序。)

【讨论】:

  • 这不是最“有效”的方式。它需要读取整个字符串并然后解析单词。 OP 想要一种方法来做到这一点。
  • 啊!对不起。我读了“最好”,我的脑海里跳过了“高效”。通常两者并不相同。
【解决方案3】:

如果使用 Set of characters,标点符号的查找性能会更好。

Set<Character> punctationchars ....
if(punctationcahars.contains(yourChar) { ... }

【讨论】:

  • 如果字符数较少,O(n)查找数组和O(1)查找hashtable的区别基本相同。这取决于我猜有多少个字符。
【解决方案4】:

只需使用Scanner 阅读Strings:

Scanner in = new Scanner(...);

while (in.hasNext()) {
    String word = in.next();
    /* do something with the word, check punctuation, etc. */
}

【讨论】:

  • 但这需要解析所有字符并从中生成一个字符串..听起来效率不高。
猜你喜欢
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2019-05-17
  • 2014-12-17
  • 2020-08-20
  • 2020-03-19
相关资源
最近更新 更多