有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将两个列表组合起来,并在匹配后设置值

我有两个组织列表,一个是用户,另一个是数据库中的所有组织,我在彼此内部做了两个循环,为原始列表设置followed的值,如果用户遵循这个组织(可以从用户组织列表中知道)

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;
        }
    }
}

我相信有更好的方法来做到这一点


共 (2) 个答案

  1. # 1 楼答案

    尝试使用地图id->;组织这样就有了两个非嵌套循环,一个用于构建地图,另一个用于循环organizations并匹配对象

    例如:

    //build the map
    Map<Integer, Organization> orgsInDB = new HashMap<>();
    for( Organization org : organizationList ) {
      orgsInDB.put(org.getId(), org );
    }
    
    //match
    for( Organization org : organizations ) {
      Organization orgInDB = orgsInDB.get( org.getId() );
      if( orgInDB != null ) {
        orgInDB.setFollowed( true );
      }
    }
    

    其复杂性从O(n*m)下降到O(n+m)

    编辑:正如Al Mothafar正确指出的,我们应该考虑所有组织都会遇到的最坏情况。因此,他的方法的复杂性将是O(n2),而上面的方法将是O(n+n)(或者,由于常量因子通常在大oh符号中被忽略,所以只有O(n))

  2. # 2 楼答案

    我使用了Apache commons库中的CollectionUtils。它有静态的交集、并集和减法,也适合你的情况。也很整洁

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