[英]Most efficient way to compare a list of strings to a list of objects with a string field
所以我有這個問題實際上在我的代碼中發生了很多,但這是最簡單的例子。 問題是我有一個對象,其中包含與另一個對象的“名稱”或“ID”或“用戶名”(取決於)字段對應的字符串列表。 因此,例如,我有一個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
列表而不是String
列表。 但是,我可以向UserModel
添加一個Group
字段,並且可以創建一個包裝類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
s 與其字符串Username
s 匹配?
首先,對於您的問題是否像您的帖子標題一樣通用,我有點困惑:
將字符串列表與具有字符串字段的對象列表進行比較
或者如果它像您帖子中的最后一行一樣具體:
有沒有更好的方法將 UserModels 與其字符串 Usernames 匹配?
我來回答后者。
這是我的建議 - 讓userManagementClient
維護一個HashMap
其鍵是用戶名,其值是UserModel
對象。 然后,您可以修改您調用userManagementClient
的實例的類(不確定名稱,您沒有提供),以提供基於String
參數(用戶名)獲取UserModel
的方法:
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,因為代碼可以正常工作而不會出錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.