同时迭代Java中的多个数组列表...最有效

时间:2015-05-29 12:45:09

标签: java list collections

我正在编写一个API,它创建一个User对象列表,然后使用该列表调用第三方Web服务。然后,第三方Web服务将返回包含用户详细信息的UserDetails对象列表。例如:

Class User{
String id;
String name;
}

使用上述User对象构建列表,然后将其传递给第三方Web服务。

List<User> users = new ArrayList <User>();

第三方Web服务然后回复一个UserDetails对象列表。

Class UserDetails {
    String id;
    String email;
    String accountNumber;
    ...
    ...
    }


List<UserDetails> userDetails = new ArrayList <UserDetails>();

现在,为了构造我的API的响应,我构造了一个UserResponse对象列表,其中包含User和UserDetails对象中的混合字段。

Class UserResponse{
String id;
String name;
String email;
String accountNumber;
....
...

}

要构造此UserResponse对象列表,我必须迭代用户List和UserDetails列表,然后检查id是否匹配,然后构造UserRepsonse对象,然后将它们添加到列表中。代码如下。

List <UserResponse> userResponseList = new ArrayList<UserResponse>();
for(User user : userRequest){
 for(UserDetails userDetail: userDetails){

if(user.getid().equalsIgnoreCase(userDetail.getId())){
    UserResponse userReponse = new UserResponse ();
    userReponse.setId(user.getId());
    userReponse.setName(user.getName());
    userReponse.setEmail(userDetail.getEmail());
    userReponse.setAccountNumber(userDetail.getAccountDetail());

    userResponseList.add(userReponse);

    }
 }
}

然后返回userResponseList。

以上代码有效。但迭代2个列表让我感到害怕。我的API可以在一个请求中拥有大约200个用户。因此,我向第三方服务发送了200个用户对象的列表,然后第三方Web服务回复了200个userDetails对象的列表。

这意味着我将在双迭代器中迭代200 * 200项。

是否有更好更有效的方法来执行此逻辑而不是多次迭代?

提前谢谢..

3 个答案:

答案 0 :(得分:1)

由于您使用id字段作为公共标识符,因此对于这两个对象,为什么不尝试使用按ID分组的UserDetails创建地图。之后,您迭代“用户”列表并使用map.get(id)为每个用户检索它的详细信息,这样您就可以根据这两种类型的对象构建所需的对象列表。

答案 1 :(得分:0)

如果你想保留你的数据结构,你可以先用id对两个数组进行排序(使用最坏情况复杂度为O(nlogn)的Arrays.sort,然后按Ben Knoble的指示搜索一次。

这会降低你的复杂度从n ^ 2到n log n,特别是在你的情况下,从2 * 200 * log(200)+ 2 * 200操作= 1320 ops从40000 +降低。

答案 2 :(得分:0)

使用java.util.Collections类及其静态方法。如果可以,还要定义ArrayList的大小,如果您没有内存问题,请使用LinkedList,而不必担心获取元素x,例如userResponseList.get(5)

List <UserResponse> userResponseList = new ArrayList<UserResponse>(userRequest.size());
userDetails.removeAll(Collections.singletonList(null)); // removes all nulls.
Comparator<String> comparator = new Comparator<String>(){
@Override
public int compare(String o1, String o2) {return o1.compare.o2;}
}

Collections.sort(userDetails, comparator);
UserDetails ud = new UserDetails();
for(User user : userRequest){
    ud.setId(user.getId());
    int index = Collections.binarySearch(userDetails, ud, comparator);
    if(index >= 0){    
       UserResponse userReponse = new UserResponse ();
       userReponse.setId(user.getId());
       userReponse.setName(user.getName());
       userReponse.setEmail(userDetail.getEmail());
       userReponse.setAccountNumber(userDetail.getAccountDetail());
       userResponseList.add(userReponse);
    }
}