You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效使用多个分隔符分割输入文本?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:11:04