所以我的问题实际上在我的代码中发生了很多,但这是最简单的例子。问题是我有一个对象,其中包含一个字符串列表,这些字符串对应于' name'或者' id'或者'用户名' (取决于)另一个对象的字段。因此,例如,我有一个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
匹配?
答案 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,因为代码可以正常运行。