gpt4 book ai didi

java - 优化两个列表比较

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

我有两个联系人列表(A 和 B),来自 SQL 数据库。在我的应用程序中,我需要根据联系人姓名显示这些列表的比较表。如果名称为 A 的联系人存在于列表 A 但不存在于列表 B 中,则联系人 A 的详细信息标记为绿色,并且在其旁边有空白的红色空间(用于列表 B 中缺少的条目。如果联系人姓名存在于 B 而不是 A , B 标记为绿色。如果联系人姓名在两个列表中都存在,但地址不同,则两个联系人都标记为黄色。

我正在生成 CSV 比较和分页界面。

目前,我的不太理想的解决方案将首先创建第三个列表,其中包含 A 和 B 中的所有联系人姓名,并删除重复项。接下来(如果分页)我将应用偏移量 + 大小。最后,对于剩余的条目,我将通过联系人姓名(从新列表中)搜索 A 和 B,并调用一个比较方法,该方法将告诉我要做什么颜色标记。

这对于我得到的数据大小来说工作正常,最多 4 -5k,分页延迟 2 秒。虽然我知道这不是一个理想的解决方案,但想不出更好的解决方案。此外,我还获得了一些新功能(过滤器更改/添加/删除),这些功能无法与此方法一起使用。

我可以使用什么其他方法来解决这个比较问题?

更新

Controller 代码:

    //createCompareList() based on parameters generate HQL query and pull contacts from Contact table 
def listA = createCompareList(params)
def listB = createCompareList(params)

def unionList = listA.collect{it.details.name}.plus(listB.collect {it.details.name})
unionList = unionList.unique()
result.unionListSize = unionList.size()
unionList.sort()

其余的比较发生在 GSP 中(这将被移动到 Controller ,并传递一些在 GSP 中需要较少处理的东西)

        <table class="table table-bordered">
<thead>
<tr>
<th> C

ontact name</th>
<th> List A </th>
<th> List B </th>
</tr>
</thead>
<tbody>
<g:each in="${unionList}" var="unionName">
<g:set var="listAContact" value="${listA.find {it.details.name.equals(unionName)}}"/>
<g:set var="listBContact" value="${listB.find {it.details.name.equals(unionName)}}"/>
<tr>

<td>
<b>${unionName}</b>
</td>

<g:if test="${listAContact}">
<g:if test="${listBContact}">
<g:if test="${listAContact?.compareTo(listBContact) == 1}">
<td class="warning">
</g:if>
<g:else>
<td>
</g:else>
<g:render template="compare_cell" model="[obj:listAContact]"/>
</td>
</g:if>
<g:else>
<td class="danger">
<g:render template="compare_cell" model="[obj:listAContact]"/>

</td>
</g:else>
</g:if>
<g:else><td></td></g:else>


<g:if test="${listBContact}">
<g:if test="${listAContact}">
<g:if test="${listBContact?.compareTo(listAContact) == 1}">
<td class="warning">
</g:if>
<g:else>
<td>
</g:else>
<g:render template="compare_cell" model="[obj:listBContact]"/>

</td>
</g:if>
<g:else>
<td class="success">
<g:render template="compare_cell" model="[obj:listBContact]"/>
</td>
</g:else>
</g:if>

<g:else><td></td></g:else>

</tr>

</g:each>
</tbody>
</table>

最佳答案

我不确定我是否正确理解您的要求,但我认为所有这些都可以在数据库端通过查询完成。

根据我的说法,让 db 处理比 jdbc 代码快得多的比较。

A 和 B 是联系人列表,在 DB 中都以表格形式存在

Req1:A 中不存在于 B 中的联系人列表

select id  <or required attrib> from A where id not in (select id from B)

这将是一个仅在 A 中的 id 列表,将它们附加到 java 列表 A 中,颜色为绿色,因为您知道 B 中没有匹配的条目,将 B 中的相应条目保持为空

Req2:B 中唯一联系人的类似内容

select id  <or required attrib> from B where id not in (select id from A)

两个列表中的内容完全相反,现在将此列表附加到 B 中,颜色为绿色,并在 A 中附加相应的空条目

Req3:两个列表中的 id 相同,但地址不同

select A.id from A,B where A.id=B.id and A.addr<>B.addr

这给出了匹配但具有差异地址的 ID 列表,现在将 ID 附加到黄色的两个列表中

这节省了比较、着色任务,这些任务在 java/pgming 语言中有点繁重。

关于java - 优化两个列表比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137539/

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