[英]How to search two arraylists to find a match in java
我有两个用户数组列表,我需要通过使用用户的电子邮件地址搜索来找到一个用户。 这是我的代码。 它有效,但可以更有效地完成吗?
public String getUserId(ArrayList<User> newUsers, ArrayList<User> oldUsers, String email) {
String userId = null;
for (User user1 : newUsers) {
if (user1.email.equals(email)) {
userId = user1.uid;
}
}
if(userId == null){
for (User user2 : oldUsers) {
if (user2.email.equals(email)) {
userId = user2.uid;
}
}
}
return userId;
}
这是用户类。
public class User {
public String uid;
public String email;
public String name;
public String phoneNumber;
public User() {
}
}
您需要在找到匹配项后立即通过break
终止循环:
public String getUserId(ArrayList<User> newUsers, ArrayList<User> oldUsers, String email) {
String userId = null;
for (User user1 : newUsers) {
if (user1.email.equals(email)) {
userId = user1.uid;
break;
}
}
if(userId == null){
for (User user2 : oldUsers) {
if (user2.email.equals(email)) {
userId = user2.uid;
break;
}
}
}
return userId;
}
Java 8 具有类似于 C# 中的 Linq 的Stream API
你可以这样做:
User foundUser = newUsers.stream()
.filter((user) -> user.email == email)
.findFirst()
if(foundUser == null){
foundUser = oldUsers.stream()
.filter((user) -> user.email == email)
.findFirst()
}
return foundUser.uid;
基本上它做同样的事情,但更多的速记更整洁/更容易阅读。
如果要继续使用 for 循环,请添加一个 break,以便在找到匹配项时退出 for 循环
您可以将两个列表合并为一个列表,然后只搜索该列表而不是遍历两个列表。
public String getUserId(ArrayList<User> newUsers, ArrayList<User> oldUsers, String email) {
// create a new list
List<User> consolidatedList = new ArrayList<>();
// add both lists to it
consolidatedList.addAll(newUsers);
consolidatedList.addAll(oldUsers);
// now just iterate over it
User findAnyUser = consolidatedList.stream().filter(e -> e.getEmail().equals(email))
.findFirst().orElse(null);
return findAnyUser != null ? findAnyUser.getUid() : "Not Found";
}
一旦找到第一个匹配项,列表的迭代就会停止,并返回相应的User
对象。 现在我们检查findAnyUser
是否为空,根据它我们返回适当的uid
。
使用 Java 8 Stream API 和 Lambda:
List<User> allUsers = new ArrayList<>();
allUsers.addAll(oldUsers);
allUsers.addAll(newUsers);
Optional<User> result = allUsers.stream()
.filter(user -> email.equals(user.email))
.findAny();
一线解决方案(java 8+):
return Stream
.of(newUsers, oldUsers)
.flatMap(Collection::stream)
.filter(u -> Objects.equals(email, u.email))
.findFirst()
.orElse(new User()).email;
但它会强制您在找不到用户时实例化用户。
这是最干净的方法:
public int findRapperIndexInPairings(User user){
int index1 = getPairing1().indexOf(user);
int index2 = getPairing2().indexOf(user);
int userIndex = -1;
if(index1 > 1) userIndex = index1;
if(index2 > 1) userIndex = index2;
return userIndex;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.