一旦匹配,将2个列表组合并设置值

时间:2016-03-08 11:43:11

标签: java performance

我有2个组织列表,一个跟随用户,另一个是数据库中的所有组织,我在彼此之间创建了2个循环,以followed为原始列表设置值true如果用户关注此组织(可以从用户组织列表中获知)

List<Organization> organizationList = getServiceInstance().getOrganizationService().findOrganizationList();
List<Organization> organizations = getServiceInstance().getOrganizationService().findFollowedOrganizationList(userId);
for (Organization fOrg: organizations) {
    for (Organization organization : organizationList) {
        if (Objects.equals(fOrg.id, organization.id)) {
            fOrg.followed = true;
        }
    }
}

我相信有更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

尝试使用地图ID-&gt;组织。这样你就有了2个非嵌套循环,一个用于构建地图,一个循环遍历ID Name List Of IDs From Table1 并匹配对象。

示例:

organizations

这种复杂性从O(n * m)下降到O(n + m)。

编辑:正如Al-Mothafar正确指出的那样,我们应该考虑跟随所有组织的最坏情况。因此,他的方法的复杂性将是O(n 2 ),而上述方法将是O(n + n)(或者,因为常数因子通常被遗漏为大哦符号,只是O( n))的

答案 1 :(得分:1)

我使用了Apache commons库中的CollectionUtils。它具有静态交集,并集和减法方法,适用于您的情况。非常整洁。

很好地解释了here与集合论的关系:)

答案 2 :(得分:0)

我不认为有更好的方法可以做到这一点,至少在性能方面没有:你必须在某个地方迭代组织。通过将一些行打包成私有方法可以提高可读性。

我唯一的建议是你可以用Organization.followers(List)替换Organization.followed(boolean)。如果是这样,您可以简单地检查列表是否为空。 OTOH,这可能会减慢数据库访问速度。