У меня есть два списка (A и B) контактов, поступающих из SQL DB. В моем приложении мне нужно отобразить таблицу сравнения этих списков на основе имени контакта. Если в списке A существует контакт A, но не B, детали контакта A отмечены зеленым, а рядом с ним у меня пустое красное пространство (для отсутствия записи из списка B. Если имя контакта существует в B, а не в A , B отмечен зеленый цвет. Если имя контакта существует в обеих списках, но с разницей в адресе, оба контакт помечен желтым цвет.Оптимизация сравнения двух списков
Я генерация как сравнения CSV и постраничный интерфейс.
в настоящее время , мое не очень оптимальное решение сначала создаст третий список со всеми именами контактов из A и B, удалив дубликаты. Затем (если разбиение на страницы) я буду применять размер смещения +. Наконец, с остальными записями я буду искать A и B по имени контакта (из нового списка), и вызовите метод сравнения, который скажет мне, что делать с цветовой маркировкой.
Это работало нормально для данных, которые у меня есть, до 4 -5k, с задержками в 2 секунды в разбивке на страницы. Хотя я знаю, что это не идеальное решение, но не может придумать лучшего. Также я получил некоторые новые функции (изменения фильтра/добавления/удаления), которые не будут работать оптимально с этим методом.
Какой еще подход можно использовать для этой проблемы сравнения?
Update
контроллер код:
//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 (это будет перемещен в контроллер, и передать то, что требует меньше обработки в 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>
что вы уже пробовали показать код – santhosh
Я объясняю во втором абзаце. – Giannis
Если ваш код * работает *, но вы ищете предложения по его улучшению, вы можете попробовать опубликовать его на странице [Обзор кода] (http://codereview.stackexchange.com/). Если он работает неправильно, это не по теме, но вы все равно должны продемонстрировать здесь, что вы пробовали до сих пор, чтобы мы могли более четко понять вашу ситуацию. –