比较数组内容准确性算法



我在数组中有 voiceResults 来搜索联系人:

Ben McDonald
Ben MacDonald
Ken McDonald
Ken MacDonald

我已经在另一个数组中建立了潜在的匹配(示例):

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/字谜逻辑,我需要删除匹配的字母,直到我留下不匹配的字母,并再次将该数量与原始长度进行比较以获得百分比。

查看上面的示例数组数据,我还需要反向执行此操作并吐出名字和姓氏。

对于每个数组,我从以下内容开始:

    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]", "");
    }

我发布了上述内容,但我确定这不是正确的启动方法。

通读许多字谜检查和算法的例子,它们差异很大,并且使用 for 和 while 循环、哈希图、哈希表、直方图、浮点值等。

举起双手,我完全不知道哪个是最初执行这些循环、内循环、内元素循环的最佳/最快/最实用的方法......

如果我能就如何开始构建循环提出一些建议,将不胜感激。

字母比较和反向迭代的进一步建议/示例/链接将非常棒。希望我能把所有东西拼凑在一起。

最后,我应该如何存储与元素相关的这些百分比?

我提前谢谢你。

请注意:尽管示例数据可能另有建议,但我已经使用了循环和 .contains() .matches() 等。

有许多不同的拼写算法,但过去我使用过Levenshtein或Soundex(每种算法都有其优点和缺点)。Soundex可能更适合您,因为您从人声中获得了这一点。

您可能还想查看:

获取最接近的字符串匹配项

什么算法在拼写检查器中提供建议?

您也可以使用此库;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");   

最新更新