查找相同字母组成的字谜

Posted zhoupp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找相同字母组成的字谜相关的知识,希望对你有一定的参考价值。

数据集导入HDFS

技术图片

通过命令行访问刚刚上传至HDFS的数据集

[[email protected] hadoop-2.6.0]$ bin/hdfs dfs -ls /anagram/

技术图片

MapReduce程序编译及运行:

第一步:在 Map 阶段,对每个word(单词)按字母进行排序生成sortedWord,然后输出key/value键值对(sortedWord,word)。

//写Map过程
	public static class Anagramsmapper extends Mapper<LongWritable, Text, Text, Text> {
		
		public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			String text = value.toString(); //将输入的Text类型的字母表value转为String类型
			
			char[] textCharArray = text.toCharArray(); //把String类型的字母表转成字符数组
			
			Arrays.sort(textCharArray); //对字符数组进行排序
			
			String sortedText = new String(textCharArray); //将排序后的字符数组,转成String字符串
			
			context.write(new Text(sortedText), value);  //写入context,输出key(排序后的字母表)和输出value(原始字母表)
			
		}
		
	}

第二步:在 Reduce 阶段,统计出每组相同字母组成的所有anagrams(字谜)。

//写Reduce过程
	public static class Anagramsreducer extends Reducer<Text, Text, Text, Text> {
		public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
			StringBuffer res = new StringBuffer(); //新建一个空的StringBuffer实例res
			
			int count = 0;  //计数器初始值为0
			
			//开始遍历values里的值
			for (Text text : values) {
				
				//如果res数组里面有值,添加新值的时候先加的一个“,”号作分割符
				if(res.length() > 0) {
					res.append(",");
				}
				
				//往res里添加values里的值
				res.append(text);
				
				//计数
				count++;
			}
			
			//必须有两个或者两个以上相同字母组成的单词,才显示
			if(count > 1) {
				context.write(key, new Text(res.toString()));
			}
			
			
		}
		
	}

第三步:对代码进行单元测试及debug调试。

public class AnagramsMapperTest {
	private Mapper mapper;
	private MapDriver driver;
	
	@Before
	public void init() {
		mapper = new Anagrams.Anagramsmapper();
		driver = new MapDriver(mapper);
	}
	
	@Test
	public void test() throws IOException {
		String line = "gfedcba";  //自定这个字母,验证输出结果是否会正确排序
		driver.withInput(new LongWritable(), new Text(line))
		      .withOutput(new Text("abcdefg"),new Text("gfedcba"))  //验证输出Key是否进行了字母排序,输出Value不变
		      .runTest();
		
	}

}

  

public class AnagramsReduceTest {
	private Reducer reducer;
	private ReduceDriver driver;
	@Before
	public void init() {
		reducer = new Anagrams.Anagramsreducer();
		driver = new ReduceDriver(reducer);
	}
	
	@Test
	public void test() throws IOException {
		Text key = new Text("abcdefg"); //新建一个Key,输出固定不变
		List values = new ArrayList();  //在新建数组列表中写入4组字母的Value值,目的验证其最后是否按预定格式输出
		values.add(new Text("gfedcba"));
		values.add(new Text("decgfba"));
		values.add(new Text("fedgcba"));
		values.add(new Text("gcbfeda"));
		
		driver.withInput(key, values)
		      .withOutput(key, new Text("gfedcba,decgfba,fedgcba,gcbfeda"))  //验证是否按此格式输出
		      .runTest();
		
	}
	

}

第四步:将项目编译和打包为Anagram.jar,使用客户端将 Anagram.jar上传至hadoop的/home/hadoop/Temp目录下。

技术图片

第五步:使用cd /home/hadoop/Temp 切换到当前目录,通过hadoop jar Anagram.jar com.hadoop.base.Anagram /anagram/anagram.txt /anagram/out命令行执行任务。

技术图片

第六步:任务的最终结果输出到 HDFS ,使用hadoop fs -cat /anagram/out/part-r-00000命令查看结果。

技术图片

 

以上是关于查找相同字母组成的字谜的主要内容,如果未能解决你的问题,请参考以下文章

48个值得掌握的JavaScript代码片段(上)

查找字谜的算法 Objective-C

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

代码高尔夫:查找所有字谜

查找字典单词的字谜

php |字谜求解器通过 woldcard 查找不在原始搜索中的字母