Java 检查ArrayList中数据类中的字符串字段是否具有给定值
我有一个数据类的Java 检查ArrayList中数据类中的字符串字段是否具有给定值,java,arraylist,Java,Arraylist,我有一个数据类的ArrayList,名为Customer: public class Customer { private String userid; private String fullName; private String phoneNumber; private String email; private String addressOne; private String addressTwo; private String
ArrayList
,名为Customer
:
public class Customer {
private String userid;
private String fullName;
private String phoneNumber;
private String email;
private String addressOne;
private String addressTwo;
private String city;
private String state;
private String zip;
private String country;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddressOne() {
return addressOne;
}
public void setAddressOne(String addressOne) {
this.addressOne = addressOne;
}
public String getAddressTwo() {
return addressTwo;
}
public void setAddressTwo(String addressTwo) {
this.addressTwo = addressTwo;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
我创建了一个客户列表
ArrayList<Customer> customersList = new ArrayList<Customer>();
ArrayList CustomerList=new ArrayList();
我在循环中加载了许多客户的ArrayList
如何检查名为“David Paul”的客户是否已在阵列列表中?您可以执行以下操作:
boolean contains = customersList.stream()
.anyMatch(c -> c.getFullName().equals("David Paul"));
你可以做:
boolean contains = customersList.stream()
.anyMatch(c -> c.getFullName().equals("David Paul"));
使用ArrayList
,您只需逐个元素遍历整个列表,并检查给定客户是否在那里。这将很慢(O(n^2)
slow)
如果您可以将列表更改为Set
将是一种首选方法,那么您只需覆盖hashCode
和equals
方法以使用fullName
,并使用Set.contains()
以恒定时间检查它。或者,您可以制作一个地图
,其中键将位于全名
,并且您可以在固定时间内再次检查给定键是否存在
如果需要保持插入顺序,可以使用LinkedHashMap
或LinkedHashSet
等工具,使用ArrayList
,只需逐个元素遍历整个列表,并检查给定客户是否在那里。这将很慢(O(n^2)
slow)
如果您可以将列表更改为Set
将是一种首选方法,那么您只需覆盖hashCode
和equals
方法以使用fullName
,并使用Set.contains()
以恒定时间检查它。或者,您可以制作一个地图
,其中键将位于全名
,并且您可以在固定时间内再次检查给定键是否存在
如果您需要保持插入顺序,您可以使用类似于LinkedHashMap
或LinkedHashSet
的方法,它可以工作,如果stackoverflow允许,我将在10分钟内接受它。但是c->c对我来说是新语法。这叫什么?contains()
够了吗?@DizzyCode在这种情况下不行,我想是因为我使用的是数据类而不是string@Aryac->……
是Java中引入的lambda表示法8@Arya您可以重写该类中的equals
方法,仅使用fullName
,如果您没有在其他任何地方使用它,那么contains
将起作用,但仍然会很慢。它起作用,如果stackoverflow允许的话,我会在10分钟内接受。但是c->c对我来说是新语法。这叫什么?contains()
够了吗?@DizzyCode在这种情况下不行,我想是因为我使用的是数据类而不是string@Aryac->……
是Java中引入的lambda表示法8@Arya如果不在其他任何地方使用,则可以重写该类中的equals
方法,以仅使用fullName
,然后contains
将起作用,但仍然会很慢。遍历列表是O(n)。那么两个客户不一定是因为他们有相同的名字。而且它也不能真正回答OP的问题。@Jeanlogart我理解这个问题,OP希望在每次插入之前检查它,同时读取最后的数据O(n^2)
(所有客户是否都是唯一的)。我的回答怎么不能回答他的问题呢?我告诉他,对于一个列表,他需要遍历整个列表或更改数据结构。我没有为他编写代码,但这并不意味着我没有回答他的问题。@MateuszDymczyk你的方法很好,但因为我先尝试了Jean的答案,我的程序使用的列表非常小,所以我接受了他的答案。不过我确实对你的答案投了赞成票。@Arya没问题,不是为了分数:-)不过,看看集合和地图吧,仅供将来参考!如果您不明确需要ArrayList
方法,可以将第一个ArrayList
更改为一个List
,Dumczyk,您能解释一下为什么您的解决方案只需要恒定的时间吗?是的,您可以通过这种方式访问它,但是您可以将整个程序的比较减少到全名。。。我们对这个项目不太了解,但特别是在更大的项目中,我不建议像你说的那样去做。这有意义吗?希望…浏览列表是O(n)。那么两个客户不一定是因为他们有相同的名字。而且它也不能真正回答OP的问题。@Jeanlogart我理解这个问题,OP希望在每次插入之前检查它,同时读取最后的数据O(n^2)
(所有客户是否都是唯一的)。我的回答怎么不能回答他的问题呢?我告诉他,对于一个列表,他需要遍历整个列表或更改数据结构。我没有为他编写代码,但这并不意味着我没有回答他的问题。@MateuszDymczyk你的方法很好,但因为我先尝试了Jean的答案,我的程序使用的列表非常小,所以我接受了他的答案。不过我确实对你的答案投了赞成票。@Arya没问题,不是为了分数:-)不过,看看集合和地图吧,仅供将来参考!如果您不明确需要ArrayList
方法,可以将第一个ArrayList
更改为一个List
,Dumczyk,您能解释一下为什么您的解决方案只需要恒定的时间吗?是的,您可以通过这种方式访问它,但是您可以将整个程序的比较减少到全名。。。我们对这个项目不太了解,但特别是在更大的项目中,我不建议像你说的那样去做。这有意义吗?有希望地。。。