求单词长度

7-26 (15 分)
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。
这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式:


输入在一行中给出一行文本,以.结束
提示:用scanf("%c",...);来读入一个字符,直到读到.为止。
输出格式:


在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:


It's great to see you here.
输出样例:


4 5 2 3 3 4


#include <stdio.h>  
int main()  
{   int i=0;  
    char a;  
    while(1){  
        scanf("%c",&a);  
        if(a == '.'){  
                        if(i!=0){  
                                printf("%d",i);  
                        }  
                        printf("\n");  
                        break;  
                }  
        if(a==' '){  
                        if(i!=0){  
                                printf("%d ",i);  
                                i=0;  
                        }  
                }  
        else{  
 i+=1;  
        }  
    }  
return 0;  
}  
<think>好的,用户问的是“hadoop单词长度”,我需要先理解他的需。Hadoop通常用于处理大规模数据,所以可能他需要的是统计每个单词长度,或者计算所有单词的平均长度之类的。 首先,我得确认用户的具体需单词长度可能有不同的情况,比如统计每个单词的出现次数同时记录其长度,或者单纯统计每个单词长度分布。比如,想知道不同长度单词各有多少个,或者所有单词的平均长度等。 接下来,考虑在Hadoop中如何实现。Hadoop使用的是MapReduce模型,分为Map阶段和Reduce阶段。如果是统计每个单词长度,可能需要将每个单词作为键,然后在reduce中计算长度。不过更可能的是用户想要统计不同长度单词的数量,比如长度为1的单词有多少个,长度为2的有多少,等等。 例如,在Map阶段,可以将每个单词转换为它的长度作为键,值设为1。然后在Reduce阶段,将相同长度的计数相加,得到每个长度对应的总次数。这样就能得到单词长度的分布情况。 需要编写Mapper和Reducer的代码。Mapper读取输入文本,分割成单词,然后对每个单词计算长度,并发射(emit)长度和1。Reducer接收这些键值对,对每个长度和。 可能还需要考虑一些细节,比如去除标点符号,处理大小写,是否将单词转为小写,以及如何处理空字符串等。这些预处理步骤可能在Mapper中进行。 然后需要打包成JAR文件,提交到Hadoop集群运行。用户可能需要了解具体的代码示例,所以需要给出一个简单的例子,比如WordCount的变种,把单词替换为长度。 另外,可能用户对Hadoop的基本流程不熟悉,需要简要说明MapReduce的工作原理,以及各个阶段的任务。比如,输入分片、Map任务处理、Shuffle和Sort、Reduce任务汇总等。 还需要提到输入和输出的路径设置,以及如何查看结果。可能用户会遇到常见错误,比如未正确设置输出目录,或者Mapper/Reducer的逻辑错误,可以提醒注意检查这些部分。 最后,可能需要扩展说明其他可能性,比如如果用户想要同时统计单词的出现次数和平均长度,应该如何调整程序结构,或者使用Combiner优化等。 总结一下,回答应该包括:需分析、MapReduce实现思路、代码示例、运行步骤以及注意事项。确保用户能够根据指导完成Hadoop任务的编写和执行。</think>在Hadoop中统计单词长度的典型场景是:**统计文本中不同长度单词的出现次数**(例如长度为2的单词出现100次,长度为3的单词出现200次)。以下是实现方案: --- ### 一、实现原理(MapReduce模型) 1. **Mapper阶段** - 输入:逐行读取文本数据 - 处理:将每个单词转换为长度,输出`(length, 1)` - 示例:`"Hello" → (5,1)` 2. **Reducer阶段** - 输入:接收`(length, [1,1,1...])` - 处理:对相同长度的计数和 - 示例:`(5, [1,1]) → (5,2)` --- ### 二、完整代码实现 #### 1. Mapper类 ```java public class WordLengthMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> { private final static IntWritable one = new IntWritable(1); private IntWritable length = new IntWritable(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); // 用正则表达式分割单词(过滤标点) String[] words = line.split("[^a-zA-Z']+"); for (String word : words) { if (!word.isEmpty()) { length.set(word.length()); context.write(length, one); // 输出 (单词长度, 1) } } } } ``` #### 2. Reducer类 ```java public class WordLengthReducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable> { public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); // 输出 (单词长度, 总次数) } } ``` --- ### 三、运行步骤 1. 打包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值