2014-11-07 5 views
0

У меня есть два неупорядоченных списка. Я хочу, чтобы сравнить эти два списка на основе некоторых условий, которые я могу указать с помощью функции закрытия/указателя.Сравнение двух неупорядоченных списков объектов на основе замыкания

У меня возникла проблема в том, что структура объектов в этих списках может быть разной, и я хочу сравнить некоторые атрибуты в некоторых случаях, но другие атрибуты в другом случае.

например.

Class sampleObj{ 
    String attribute1; 
    List attribute2; 
    String attribute3; 
} 

List A 
Obj1-> attribute1 = "test",attribute2 = ["a","b","c"] 
Obj2 -> attribute1 = "optionalArg test 2",attribute3 = "optionalArg" 

List B 
Obj1 -> attribute3 = "test4", attribute2 = [1,2,3] 
Obj2 -> attribute3 = "optionalArg" 
Obj3 -> attribute1 = "test",attribute2 = ["a","b","c"] 

В этом случае объект 1 в Списке А равен объект 3 в списке В (оба необходимые атрибуты объекта равны) и объекта 2 в списке А равно Объект 2 в списке В (значение атрибута 3 является подстрокой атрибута 1).

Таким образом, мое условие может быть основано на перекрестном произведении атрибута 1 и атрибута 2 или на атрибуте 3. Значение, если атрибут1 и атрибут2 равны для объекта 1 из ListA и объекта 3 из ListB, можно сказать, что эти два объекта равны. В противном случае, если атрибут 3 соответствует некоторому условию для атрибута 1, то мы можем сказать, что объекты равны, то есть объект 2 из спискаB может быть равен объекту2 из списка A (условие в данном случае является проверкой подстроки)

В general Я пытаюсь написать этот библиотечный метод, который бы взял два списка и закрытие, а затем основанный на закрытом закрытии, позволяет узнать, соответствуют ли некоторые объекты в списке A списку списка B или наоборот.

Дайте мне знать, если есть какие-либо вопросы/разъяснения, необходимые здесь, и/или если вы можете вести меня в правильном направлении.

+0

это описание действительно не говорит нам достаточно о ваших критериях успеха. Я не могу сказать из вашего описания, соответствуют ли ваши два списка образцов друг другу или нет. Не могли бы вы потратить некоторое время на свое описание, чтобы дать примерные совпадения и неудачи совпадений и объяснить, почему они преуспевают или терпят неудачу? Или, может быть, вы можете показать нам пример кода, который вы пробовали, который не сработал? – BalRog

+0

Пожалуйста, ответьте, @Mayank – BalRog

+0

Извините за поздний ответ. Итак, основная вещь, которую я хочу сделать, - сравнить два списка объектов и отправить логику для сравнения как функцию указателя/Сопоставление/Закрытие и т. Д. Объекты в списке не должны быть одного типа, но могут иметь некоторые общие свойства , – Mayank

ответ

1

Если все, что вы хотите знать, является ли или не существуют совпадения между двумя списками по произвольным критериям, то все, что вам нужно, это следующее:

def hasMatches(List a, List b, Closure<Boolean> matchCriteria) { 
    a && b && a.any{ aa -> b.any { bb -> matchCriteria(aa, bb) || matchCriteria(bb, aa) } } 
} 

Тогда следующие утверждения возвращает верно:

class SampleObj{ 
    String attribute1 
    List attribute2 
    String attribute3 
    String name 

    @Override String toString() { name } 
} 

List<SampleObj> listA = [ 
    [name: "ObjA1", attribute1: "test", attribute2: ["a","b","c"]] as SampleObj, 
    [name: "ObjA2", attribute1: "optionalArg test 2", attribute3: "optionalArg"] as SampleObj 
] 

List<SampleObj> listB = [ 
    [name: "ObjB1", attribute3: "test4", attribute2: [1,2,3]] as SampleObj, 
    [name: "ObjB2", attribute3: "optionalArg"] as SampleObj, 
    [name: "ObjB3", attribute1: "test", attribute2: ["a","b","c"]] as SampleObj 
] 

// there exists at least one object in list A whose attribute 1 value matches that of at least one object in list B (or vice versa) 
assert hasMatches(listA, listB) { SampleObj aa, SampleObj bb -> aa?.attribute1 == bb?.attribute1 } 

// there exists at least one object in list B whose attribute 3 value is a substring of the attribute 1 value of at least one object in list A (or vice versa) 
assert hasMatches(listA, listB) { SampleObj aa, SampleObj bb -> bb?.attribute3 && aa?.attribute1?.contains(bb.attribute3) } 

// there does not exist any object in list A whose attribute 1 value is contained in the attribute 2 list of any object in list B (or vice versa) 
assert !hasMatches(listA, listB) { SampleObj aa, SampleObj bb -> aa?.attribute1 && bb?.attribute2?.contains(aa.attribute1) } 

Если, с другой стороны, вы на самом деле хотите, чтобы увидеть соответствующие пары, то вам нужно что-то немного более обширна:

def findEquivalentPairs(List a, List b, Closure<Boolean> matchCriteria) { 
    a && b \ 
    ? a.sum { aa -> 
     def ab = b.findResults { bb -> matchCriteria(aa, bb) ? [aa, bb] : null } ?: [] 
     def ba = b.findResults { bb -> matchCriteria(bb, aa) ? [bb, aa] : null } ?: [] 
     ab + ba 
    } 
    : [] 
} 

Затем распечатки результатов, используя те же три критерия закрытия ...

println findEquivalentPairs(listA, listB) { SampleObj aa, SampleObj bb -> aa?.attribute1 == bb?.attribute1 } 
println findEquivalentPairs(listA, listB) { SampleObj aa, SampleObj bb -> bb?.attribute3 && aa?.attribute1?.contains(bb.attribute3) } 
println findEquivalentPairs(listA, listB) { SampleObj aa, SampleObj bb -> aa?.attribute1 && bb?.attribute2?.contains(aa.attribute1) } 

... дает следующее:

[[ObjA1, ObjB3], [ObjB3, ObjA1]] 
[[ObjA2, ObjB2]] 
[] 
+0

Это похоже на то, что я собираюсь. Я попробую это позже сегодня, чтобы проверить с моим конкретным вариантом использования. – Mayank

0

Обычно для достижения этой цели вы должны использовать Comparable.

Интерфейс Comparable определяет функцию compareTo(), которую вы можете реализовать для достижения любой требуемой логики сравнения.

Или просто переопределите метод equals().

+0

@Mayank, похоже, говорит о некотором сопоставлении классов соответствия эквивалентности, а не о заказе сравнения. Более того, я думаю, что сама логика сравнения - это то, что замалчивает его/ее. Ваш ответ напоминает мне о старой шутке Стива Мартина о том, как стать миллионером и никогда не платить налоги: «Во-первых, получите миллион долларов. Затем ...» :-) – BalRog

+0

Ну, это не похоже на «Сравнительный» - это какая-то экзотика, скрытый механизм. Это хорошо известно, хорошо документировано и легко понято, если ОП решит провести базовое исследование. –

+0

Правильно, так что вы думаете, что это тот ответ, который он ищет? Это звучит для меня больше похоже на то, что он/она испытывает проблемы с самой логикой программирования и как выражать ее в закрытии Groovy (я предполагаю только последнее, поскольку в заголовке упоминаются закрытия). – BalRog

Смежные вопросы