java - 如何在 Java bean 中执行不精确比较?

标签 java search comparison

我有一个大型(超过 100K 对象)Java 对象集合,如下所示。

public class User
{
   //declared as public in this example for brevity...
   public String first_name;
   public String last_name;
   public String ssn;
   public String email;
   public String blog_url;
   ...
}

现在,我需要在此列表中搜索一个对象,其中至少有 3 个(任意 3 个或更多)属性与正在搜索的对象的属性相匹配。

例如,如果我正在搜索一个具有以下内容的对象

 first_name="John",
 last_name="Gault",
 ssn="000-00-0000",
 email="xyz@abc.com", 
 blog_url="http://myblog.wordpress.com" 

搜索应返回所有 first_name、last_name 和 ssn 匹配的对象或 last_name、ssn、email 和 blog_url 匹配的对象。同样,可能还有其他组合。

我想知道在这种情况下使用的最佳数据结构/算法是什么。对于精确搜索,我可以使用带有自定义比较器的哈希集或二分搜索,但我不确定执行此类搜索的最有效方法是什么。

附注

  • 不是家庭作业。

  • 我不确定问题标题是否合适。请随意编辑。

编辑 你们中的一些人指出,我可以使用 ssn(例如)进行搜索,因为它或多或少是唯一的。上面的例子仅说明真实场景。实际上,我有几个对象,其中某些字段为空,因此我想搜索其他字段。

最佳答案

我认为没有任何特定的数据结构可以使这种匹配/比较快速。

在比较两个对象的简单级别,您可以实现如下方法:

public boolean closeEnough(User other) {
    int count = 0;
    count += firstName.equals(other.firstName) ? 1 : 0;
    count += lastName.equals(other.lastName) ? 1 : 0;
    count += ssn.equals(other.ssn) ? 1 : 0;
    count += email.equals(other.email) ? 1 : 0;
    ...
    return count >= 3;
}

要进行大规模搜索,我能想到的改进简单线性扫描(使用上面的方法)的唯一方法是

  1. 为每个属性创建一系列多重映射,
  2. 用用户记录填充它们

然后每次你想进行查询时:

  • 查询每个多重映射以获得一组可能的候选者,
  • 使用 closeEnough() 迭代所有集合以查找匹配项。
  • 您可以通过将 SSN、电子邮件地址和博客 URL 属性与姓名属性区别对待来对此进行改进。与(例如)查找多个名为“John”的用户相比,在前三个属性上匹配的多个用户应该很少发生。您提出问题的方式需要 SSN、电子邮件或 URL 中至少 1 个进行匹配(才能获得 3 个匹配项),因此您可能根本不需要为名称属性建立索引。

    关于java - 如何在 Java bean 中执行不精确比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1659718/

    相关文章:

    php - 搜索 HTML 存储内容时忽略 HTML 字符 PHP/MySQL?

    web-services - Yelp 如何创建 "Review Highlights"部分?

    java - 为什么这在 Java 和字符串长度中有效

    php - 3个不同的等于

    arrays - 快速比较 NSArray 和 NSString?

    java - Spring Hibernate 集成抛出 getFlushMode 在没有 Activity 事务的情况下无效

    java - Maven - 为什么我不能覆盖 dependencyManagement 导入的 pom 的版本?

    java - 寻找跨平台移动应用程序与微 Controller 通信的选项

    java - 如何通过javamail访问gmail帐户

    search - 在一台物理机上运行多个 'big' Solr 分片实例