如何在没有每个方法的情况下在Groovy中找到两个列表中的公共元素并且中断一个元素

时间:2018-01-26 21:54:50

标签: groovy

我有两个列表,我必须得到两个列表中的公共元素beetwen,我对每个方法做了一些实现,但我需要突破每个,但这是不可能的。我必须改变我的实施方式。

我目前的实施是:

def buildMatchTeamsInCategoriesWithPreferences( def preferences, def teamsInCategories )
{
    def preferencesTeamsCategoriesMatch = []
    teamsInCategories.each { team ->
        preferences.each { preference ->
            if ( this.commonPresenter.getString( team?.uid ) == this.commonPresenter.getString( preference?.metaData?.team?.uid ) )
            {
                preferencesTeamsCategoriesMatch << preference
            }
        }
    }
    if ( preferencesTeamsCategoriesMatch?.isEmpty() )
    {
        return null
    }
    return preferencesTeamsCategoriesMatch[ 0 ]
}

我必须打破,找到第一个巧合时的循环并且不返回数组中的[0]元素。

我尝试使用find和findAll,但是我遇到了一些正确结果的问题,因为当找到某个元素时,我必须打破并停止迭代。

提前致谢

2 个答案:

答案 0 :(得分:0)

您实际上可以使用.find()方法执行此操作。请考虑以下脚本:

def teamsInCategories = [
        [uid: '1234-1234-1234', name: 'Lorem ipsum'],
        [uid: '1234-1234-1235', name: 'Dolor Sit'],
        [uid: '1234-1234-1236', name: 'Amet Test'],
        [uid: '1234-1234-1237', name: 'Test Test']
]

def preferences = [
        [id: 6, team: [uid: '1234-1234-1236', name: 'Amet Test']],
        [id: 7, team: [uid: '1234-1234-1237', name: 'Test Test']],
        [id: 8, team: [uid: '1234-1234-1238', name: 'A']],
        [id: 9, team: [uid: '1234-1234-1239', name: 'B']]
]

// get a list of uids only
def uids = teamsInCategories*.uid

// find the first preference that matches uid from first list
def preference = preferences.find { pref -> pref.team.uid in uids }

println preference

它不反映您的用例1:1,但它只是一个示例。这个脚本中发生的事情是我们创建uids列表,其中包含来自uid的所有teamsInCategories值(例如['1234-1234-1234', '1234-1234-1235', '1234-1234-1236', '1234-1234-1237']),然后我们调用将返回第一个元素的preferences.find()与我们的谓词匹配的preferences列表 - pref.team.uid列表中存在uids

运行此脚本会产生以下输出:

[id:6, team:[uid:1234-1234-1236, name:Amet Test]]

我希望这个答案能让您了解如何在两个不同的列表中找到第一个共同元素。

答案 1 :(得分:0)

考虑findResult上的Collection方法(文档here)。对于原始实现:

def buildMatchTeamsInCategoriesWithPreferences(def preferences, def teamsInCategories) {
    teamsInCategories.findResult { team ->
        def uidA = commonPresenter.getString(team?.uid)

        preferences.findResult { preference ->
            def uidB = commonPresenter.getString(preference?.metaData?.team?.uid)
            (uidA == uidB) ? preference : null
        }
    }
}