簡體   English   中英

將字符串列表與具有字符串字段的對象列表進行比較的最有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM