如何根据数组中的一个变量知道一个对象是否存在于数组列表中



我有数组列表,让我们为用户考虑一下。每个用户对象都有一个名为 id 的变量,我尝试使用它包含完全相同对象的方法,但我惊讶地发现它不起作用。我如何知道列表是否包含具有我正在寻找的 id 的用户,而无需循环列表元素?我知道我可以使用循环,但我正在寻找更好的方法来做到这一点

数组列表中包含的始终是线性复杂性,这意味着它始终循环遍历元素。如果您希望包含按预期方式工作,则可以覆盖 equals 并使其使用 User 类中的 id 字段。解决此问题的另一种方法是不使用数组列表,而是使用HashMap,将您的ID作为键,将用户作为值,甚至是HashSet,因为它在将元素添加到集合之前总是使用equals。

public class UserList extends ArrayList<User> {
@Override
public boolean contains(Object o) {
Object[] arr = this.toArray();
for (Object obj:arr) {
if(obj.toString().equals(String.valueOf(o))){
return  true;
}
}
return false;
}}
class User {
String id;
String name;
@Override
public String toString() {
return id;
}

}

如果您没有在 User 类中覆盖等于,它将检查它是否是同一个实例,而不是字段值是否相等。 如果您不想覆盖等于,仅使用 id,您可以将用户保留在

Map<String,User> users; => users.containsKey(id) 

其中键是 ID,或者只将 ID 保留在单独的

Set<String> ids; and call contains. => ids.contains(id)

正如你提到的,可以迭代数组列表来得到答案。如果您不想这样做,您可以将值复制到哈希映射中,例如:

Map<String, User> userMap = new HashMap();
for (int i=0; i<arrayList.size(); i++) {
userMap.put(arrayList.get(i).getId(), arrayList.get(i));
}
String isExist = userMap.containsKey(id);

假设您想选择具有id=23的用户,使用流,

List<User> usersLlist = New LinkedList<>();
User user;
user = usersLlist.stream().filter( user -> user.id == 23).findAny();

如果使用 get 方法获取用户 ID

user = usersLlist.stream().filter( user -> user.getId() == 23).findAny();

最新更新