将字符串列表与字符串字段对象列表进行比较的最有效方法
所以我有这个问题,在我的代码中实际发生了很多,但这里是最简单的例子。问题是我有一个对象,其中包含与其他对象的'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匹配?
首先,我有点困惑,你的问题是否是一般的喜欢你的文章的标题:
字符串列表比较对象的列表使用字符串字段
,或者如果它的具体就像在您的文章的最后一行:
有没有更好的办法,以配合他们的字符串用户名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,因为代码工作没有错误。
您可能应该有一张地图,而不是拥有所有用户列表。或者更好的是,一个数据库。 – RealSkeptic
不能以某种方式从userManagementClient.get(username)获取UserModel吗? – Matt