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

时间:2016-11-16 15:34:15

标签: java list

所以我的问题实际上在我的代码中发生了很多,但这是最简单的例子。问题是我有一个对象,其中包含一个字符串列表,这些字符串对应于&#39; name&#39;或者&#39; id&#39;或者&#39;用户名&#39; (取决于)另一个对象的字段。因此,例如,我有一个import Foundation import UIKit class nextVC: UIViewController { var articleImage = UIImage() var articleMainTitle = String() var articleContent = String() @IBOutlet var mainImageView: UIImageView! @IBOutlet var articleTitle: UILabel! @IBOutlet var articleContentValue: UILabel! override func viewDidLoad() { articleTitle.text = articleMainTitle mainImageView.image = articleImage articleContentValue.text = articleContent articleContentValue.font = UIFont(name: "Helvetica", size:12) _ = articleContent.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression, range: nil) } } 对象,如下所示:

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添加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匹配?

1 个答案:

答案 0 :(得分:1)

首先,我对你的问题是否像你的帖子的标题一般有点疑惑:

  

将字符串列表与具有字符串字段

的对象列表进行比较

或者如果它与您帖子中的最后一行具体相符:

  

是否有更好的方法将UserModels与其字符串Usernames相匹配?

我要回答后者。

以下是我的建议 - 让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相关联的用户,而不是所有用户,并且您无需反复使用UserModel即可获得contains。< / p>

最后一个想法 - 这个问题可能更适合codereview.stackexchange.com,因为代码可以正常运行。