我在数组中有voiceResults来搜索联系人:
Ben McDonald
Ben MacDonald
Ken McDonald
Ken MacDonald
我在另一个数组中建立了potentialMatches(示例):
Ben McDonald
Benjamin MacDonald
Donna McBlead //anagram
Ben Mad
abcdelmno //occurrences in alphabetical order
onmledcba //occurrences in reverse alphabetical order
completely Random
a cannon
BK Lounge
我的目标是确定哪个是用户想要查看的最有可能的联系人。
当循环遍历两个阵列时,我想对游戏Mastermind使用类似的逻辑,在那里我可以看到一封信是'正确但是在错误的地方'或'正确和正确的地方' 。然后我可以将它与元素的.length()进行比较,得到浮动百分比的字母匹配和精确位置匹配。
为了做到这一点,我不仅需要在数组的元素之间循环,然后我需要用它们的字母来分解元素并比较那些单独的元素字母。要建立Mastermind / anagram逻辑,我需要删除匹配的字母,直到我留下不匹配的字母,并再次将该数量与原始长度进行比较以获得百分比。
查看上面的示例数组数据,我还需要反向执行此操作并吐出名字和姓氏。
对于我从以下开始的每个数组:
ArrayList<String> voiceResults = new ArrayList<String>();
ListIterator<String> itr = voiceResults .listIterator();
Arrays.asList(voiceResults.toArray());
while (itr.hasNext()) {
sid = itr.nextIndex();
element = itr.next();
sidpass = sid.toString();
rawpass = element.toString().toLowerCase();
rawpass.trim();
hcs = rawpass.split("\\s");
hnc = hcs.length;
if (hnc == 2) {
fn = hcs[0]; //first name
ln = hcs[1]; //last name
fn = fn.replaceAll("[^a-z]", ""); //remove punctuation
ln = ln.replaceAll("[^a-z]", "");
}
我发布了上述内容,但我确定这不是正确的启动方法。
通过阅读许多anagram检查和算法的例子,它们变化很大,并且使用for和while循环,哈希映射,哈希表,直方图,浮点值等。
我举起手来,我完全失去了最初/最快/最实用的方法来初步执行这些循环,内部循环,内部元素循环......
如果我可以对如何构建循环开始提供一些建议,我将不胜感激。
字母比较和反向迭代的进一步建议/示例/链接将是非常棒的。希望我能把所有东西拼凑起来。
最后,我应该如何存储与元素相关的百分比?
我提前感谢你。
请注意:虽然示例数据可能另有说明,但我已经使用了循环和.contains()。匹配()等等。
答案 0 :(得分:1)
有许多不同的拼写算法,但在过去我使用过Levenshtein或Soundex(各有其优缺点)。 Soundex可能会对你有所帮助,因为你从声音中得到这个。
您可能还想查看:
Getting the closest string match
和
答案 1 :(得分:1)
您也可以使用此库; http://code.google.com/p/string-similarity/
实施干净,易于根据您的需求进行定制。
例如,让我们使用JaroStrategy进行字符串比较
double similarity = 0.0;
// Calculates the similarity score of objects, whereas
// 0.0 implies absolutely no similarity
// 1.0 implies absolute similarity.
SimilarityStrategy strategy = new JaroStrategy();
StringSimilarityService service = new StringSimilarityServiceImpl(strategy);
similarity = service.score("Ben McDonald", "Ken MacDonald");