如何高效使用多个分隔符分割输入文本?Java实现疑问
问题描述
更新:问题已解决!感谢各位的帮助!
我有如下格式的数据集:
Title: The Importance of Being Earnest A Trivial Comedy for Serious People Author: Oscar Wilde
我希望以空格、\t、\n、\r、\f作为分隔符分割文本,其他符号如",.:"需视为单词的一部分。请问是否存在高效的实现方式?
我已尝试以下代码:
public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString(), "\t"); }
我知道可以通过制表符分割令牌,请问是否支持使用多个分隔符进行分割?
解决方案
直接使用StringTokenizer传入多分隔符
StringTokenizer本身支持同时传入多个分隔符,你只需要把所有要用作分隔符的字符拼接成字符串,作为构造函数的第二个参数即可。针对你的需求,把空格、\t、\n、\r、\f都传入,就能实现按这些字符分割,同时保留其他符号在令牌中。
修改后的代码示例:
public void map(Object key, Text value, Context context) throws IOException, InterruptedException { // 传入所有需要的分隔符:制表符、换行、回车、换页、空格 StringTokenizer itr = new StringTokenizer(value.toString(), "\t\n\r\f "); while (itr.hasMoreTokens()) { String token = itr.nextToken(); // 这里添加你的业务逻辑,比如输出键值对 context.write(new Text(token), new IntWritable(1)); } }
为什么这个方式高效?
StringTokenizer是基于字符遍历的轻量实现,不需要生成完整的字符串数组,而是按需逐个获取令牌,内存开销更小。- 对比
String.split()(依赖正则表达式),StringTokenizer避免了正则匹配的额外性能消耗,尤其适合MapReduce这种处理海量数据的场景。
效果验证
针对你的数据集,分割后会得到如下令牌:Title:、The、Importance、of、Being、Earnest、A、Trivial、Comedy、for、Serious、People、Author:、Oscar、Wilde
完全符合你“保留",.:"等符号作为单词一部分”的要求。
内容的提问来源于stack exchange,提问作者sawada12341
相关产品推荐
相关产品推荐

