如何在Java中搜索两个arraylist以找到匹配项

时间:2018-12-18 16:02:47

标签: java android arraylist

我有两个用户的数组列表,我需要通过用用户的电子邮件地址搜索来查找用户。这是我的代码。它可以工作,但是可以更高效地完成吗?

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;
}

这是User类。

public class User {

    public String uid;
    public String email;
    public String name;
    public String phoneNumber;

    public User() {
    }
}

6 个答案:

答案 0 :(得分:1)

找到匹配项后,您需要通过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;
}

答案 1 :(得分:0)

Java 8的Stream API与C#中的Linq类似

您可以执行以下操作:

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循环,请添加一个中断,以便在找到匹配项时退出for循环

答案 2 :(得分:0)

您可以将两个列表合并为一个列表,然后仅搜索该列表而不是遍历两个列表。

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";
}

一旦找到 first 匹配项,列表的迭代就会停止,并返回相应的User对象。现在,我们检查findAnyUser是否为空,并根据它返回适当的uid

答案 3 :(得分:0)

使用Java 8流API和Lambda:

bar

答案 4 :(得分:0)

单行解决方案(java 8 +):

return Stream
            .of(newUsers, oldUsers)
            .flatMap(Collection::stream)
            .filter(u -> Objects.equals(email, u.email))
            .findFirst()
            .orElse(new User()).email;

但是当您找不到用户时,它会强制您实例化用户。

答案 5 :(得分:0)

在两个数组列表中查找一个对象

这是最干净的方式:

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;
}