同义词查找

同义词定义:如果一个单词每个字母出现的次数和另外一个单词每个字母出现的次数一样,则称这两个单词为同义词。

根据定义,我们可以将每个单词按字母排序,得出一个值(我们称之为单词签名),如果排序后的两个单词一致,则这两个单词为同义词。

package com.shuidexiongdi.thread;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

public class SimilarWord {
	
	private static void sort(char[] word) {
		Arrays.sort(word);
	}
	
	@SuppressWarnings("unchecked")
	private static void sortList(List wordsList) {
		Collections.sort(wordsList);
	}
	
	private static String getKey(Map map, String value) {
		for(Object key : map.keySet()) {
			if(map.get(key).equals(value))
				return (String) key;
		}
		return null;
	}
	
	/**
	 * 记录原单词和签名的对应关系
	 * @param set
	 * @param words
	 * @return
	 */
	@SuppressWarnings({"unchecked" })
	private static Map getRelate(Set set, String[] words) {
		
		Map map = new HashMap();
		
		for(int i = words.length; i > 0; i--) {
			char[] word = words[i-1].toLowerCase().toCharArray();
			sort(word);//对每个单词进行签名(排序)
			set.add(String.valueOf(word));//把签名放入set中,同一个签名只放一次
			map.put(words[i-1], String.valueOf(word));//设置单词与其签名对应关系
		}
		return map;
	}
	
	/**
	 * 输出类似单词,换行结束
	 * @param map
	 * @param wordsList
	 */
	private static void printlnSimilarWords(Map map, List<String> wordsList) {
		for(String word : wordsList) {
			//输出相同签名的单词
			while(map.containsValue(word)) {
				String key = getKey(map,word);
				map.remove(key);
				System.out.print(key + " ");
			}
			System.out.println();
		}
	}
	
	@SuppressWarnings("unchecked")
	public static void sortWords() {
		
		String[] words = {"creat","word","creta","am","world","ma","recta","trace"};
		
		List<String> wordsList;//记录签名的排序结果
		Set wordSet = new HashSet();//记录签名的排序结果(只是中间值)
		
		Map map = getRelate(wordSet, words);
		
		wordsList = new Vector(wordSet);//包装用于排序
		sortList(wordsList);
		
		printlnSimilarWords(map, wordsList);
	}
	
	public static void main(String[] args) {
		sortWords();
	}

}

你可能感兴趣的:(同义词)