【问题标题】:Compare array contents accuracy algorithm比较数组内容精度算法
【发布时间】:2012-06-12 12:24:19
【问题描述】:

我在数组中有 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]", "");

    }

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

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

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

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

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

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

提前谢谢你。

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

【问题讨论】:

  • 您将在数据库中搜索此名称列表,对吗?
  • 最初 .contains() 或 .matches() 使用 cur.getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));理想情况下,它会发生在第一个循环中,但是如果最初可以找到完全匹配,则很耗时或没有必要。

标签: java android


【解决方案1】:

有许多不同的拼写算法,但过去我使用过LevenshteinSoundex(各有优缺点)。 Soundex 可能对您更有效,因为您是从声乐中获得的。

您可能还想查看:

Getting the closest string match

What algorithm gives suggestions in a spell checker?

【讨论】:

  • 太棒了,非常感谢 - 我无法相信我的搜索时间我没有遇到那个 stackoverflow 帖子......
【解决方案2】:

你也可以使用这个库; 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");   

【讨论】:

  • 太好了!我看不到使用文档,但我会搜索一下。谢谢。
  • 嗯,很高兴听到这个消息。刚刚添加了示例使用代码。如果您认为这有帮助,请随时接受答案
  • 再次感谢。我找到了使用文档,它确实提供了一个非常准确的“分数”。问题是,当循环通过我的 1,000 个联系人进行测试时,速度非常慢......我正在通过标准 cur.getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME‌​));在遍历语音数据时,如 OP 中所示 - 如果您可以提出一种可以有效/快速完成的方法(!),您将获得我 100% 接受的投票!在此先感谢...
  • 改进联系人加载是一个单独的主题,我确信 stackoverflow 中已经存在关于更快比较的答案;这个库的迭代速度非常快,除此之外,我建议您在 AsyncTask 中进行此处理以避免阻塞 UI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多