繁体   English   中英

如何在 java 中搜索两个数组列表以找到匹配项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM