将字符串列表与字符串字段对象列表进行比较的最有效方法

问题描述:

所以我有这个问题,在我的代码中实际发生了很多,但这里是最简单的例子。问题是我有一个对象,其中包含与其他对象的'name'或'id'或'username'(取决于)字段对应的字符串列表。因此,举例来说,我有一个PublishGroupType物体看起来像这样:将字符串列表与字符串字段对象列表进行比较的最有效方法

public class PublishGroupType { 
    protected List<String> username; 
    protected String name; 
    public List<String> getUsername() { 
     if (username == null) { 
      username = new ArrayList<String>(); 
     } 
     return this.username; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String value) { 
     this.name = value; 
    } 
    //etc... 
} 

UserModel对象,看起来像这样:

public class UserModel { 
    private String username; 
    private String password; 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
     userData.put(UserColumns.USERNAME.getUserColumnName(), username); 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
     userData.put(UserColumns.PASSWORD.getUserColumnName(), password); 
    } 
    //etc 
} 

现在因其他原因不允许我做出重大更改为PublishGroupType,所以我不能直接更改列表以包含UserModel s列表,而不是String s。但是,我可以一个Group字段添加到UserModel,我能创造一个包装类GroupModel看起来像这样:

public class GroupModel{ 

    public PublishGroupType publishGroupType; 
    public List<UserModel> users; 

    public GroupModel(PublishGroupType publishGroup) { 
     this.publishGroupType = publishGroup; 

     List<UserModel> allUsers = userManagementClient.getAllUsers(); 

     //populate the users here from a list of all users 
     for(UserModel user : userManagementClient.getAllUsers()){ 
      if(publishGroupType.getUsername().contains(user.getUsername())){ 
       users.add(user); 
       user.setGroup(this); 
      } 
     } 
    } 
} 

现在的问题是,有很多次在所有用户的列表中的用户数超过有在一个组中,所以这对循环遍历每个组的所有用户来说效率是非常低的。请记住,这是一个小而简单的例子,发生在我的代码基础上的很多问题。有没有更好的方法将UserModel与他们的字符串Username s匹配?

+1

您可能应该有一张地图,而不是拥有所有用户列表。或者更好的是,一个数据库。 – RealSkeptic

+0

不能以某种方式从userManagementClient.get(username)获取UserModel吗? – Matt

首先,我有点困惑,你的问题是否是一般的喜欢你的文章的标题:

字符串列表比较对象的列表使用字符串字段

,或者如果它的具体就像在您的文章的最后一行:

有没有更好的办法,以配合他们的字符串用户名UserModels?

我要回答后者。

这是我的建议 - 让userManagementClient维护一个HashMap,其中的键是用户名,其值是UserModel对象。然后,你可以修改类(不知道名字的,你没有提供它),它的实例你叫userManagementClient提供一个方法来获得UserModel根据String参数(用户名):

public UserModel getUserModel(String username){ 
    return userMap.get(username); 
} 

然后你可以从这个改变你的循环:

for(UserModel user : userManagementClient.getAllUsers()){ 
    if(publishGroupType.getUsername().contains(user.getUsername())){ 
     users.add(user); 
     user.setGroup(this); 
    } 
} 

这样:

for(String user : publishGroupType.getUsername()){ 
    UserModel userModel = userManagementClient.getUserModel(user); 
    if(userModel != null){ 
     users.add(user); 
     user.setGroup(this); 
    }else{ 
     //handle missing user appropriately 
    } 
} 

现在你只能通过与其关联的用户循环publishGroupType而不是所有的用户,你可以不用contains一遍又一遍地获得UserModel

最后一个想法 - 这个问题可能会更适合codereview.stackexchange.com,因为代码工作没有错误。