gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:39:05 25 4
gpt4 key购买 nike

我有一个大型(超过 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com