我试图找出基于匹配逻辑和输入搜索标准显示组合表的最佳方法。

这是情况:

我们有一张本地存储的客户表。感兴趣的领域是SSN,名字,姓氏和出生日期。

我们还拥有一个提供相同信息的Web服务。 Web服务中的一些客户与本地文件相同,有些不同。

两者中都不需要SSN。

我需要将这些数据组合在一起,以在Grails显示屏上查看。

组合的标准为1)SSN上的匹配。 2)对于任何剩余的记录,请与名字,姓氏和出生日期完全匹配。

在这一点上,Soundex或近似逻辑无需。

看来我应该做的是将两个输入中的所有记录提取到一个集合中,以某种方式使其在SSN上设置。然后卸下空白的SSN。

这将处理SSN匹配(一旦我弄清楚如何制作该集合)。

然后,我需要返回到原始的两个输入源(在集合中缓存以防止重新阅读),然后删除先前派生的SSN集中存在的任何记录。

然后,根据名字,姓氏和出生日期创建另一个集合 - 如果我能弄清楚如何制作一组。

然后将两个派生的集合组合到一个集合中。该集合应为显示目的进行排序。

这有意义吗?我认为搜索条件将限制所吸引的记录数,因此我可以在内存中执行此操作。

从本质上讲,我正在寻找一些有关Grails代码如何寻求实现上述逻辑的想法(假设这是一种很好的方法)。本地客户表是一个域对象,而我从WS获得的是对象的数组列表。

另外,我还不清楚如何影响显示显示器的最大值,FIRSTRESULT和订单。我想我需要阅读所有首先匹配搜索条件的记录,进行组合并从派生集合中显示。

有帮助吗?

解决方案

传统的Java做到这一点的方法是将本地对象和远程对象同时使用自定义比较器(首先适用于SSN),第二名是名称/出生日期。

这可能看起来像:

def localCustomers = Customer.list()
def remoteCustomers = RemoteService.get()
TreeSet ssnFilter = new TreeSet(new ClosureComparator({c1, c2 -> c1.ssn <=> c2.ssn}))
ssnFilter.addAll(localCustomers)
ssnFilter.addAll(remoteCustomers)
TreeSet nameDobFilter = new TreeSet(new ClosureComparator({c1, c2 -> c1.firstName + c1.lastName + c1.dob <=> c2.firstName + c2.lastName + c2.dob}))
nameDobFilter.addAll(ssnFilter)
def filteredCustomers = nameDobFilter as List

在这一点上,过滤custemers具有所有记录,除了您的两个标准重复的记录。

另一种方法是通过排序和进行一个 foldr 操作,如果相邻元素匹配,则将其组合。这样,您就有机会将两个来源的数据结合在一起。

例如:

def combineByNameAndDob(customers) {
    customers.sort() { 
        c1, c2 -> (c1.firstName + c1.lastName + c1.dob) <=> 
                  (c2.firstName + c2.lastName + c2.dob)
    }.inject([]) { cs, c -> 
        if (cs && c.equalsByNameAndDob(cs[-1])) {
            cs[-1].combine(c)  //combine the attributes of both records
            cs
        } else {
            cs << c
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top