【问题标题】:How to search two arraylists to find a match in java如何搜索两个数组列表以在java中找到匹配项
【发布时间】:2018-12-18 16:02:47
【问题描述】:

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

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() {
    }
}

【问题讨论】:

  • 使用Map 代替List,并以电子邮件作为键。如果这不是一个选项,那么一旦找到匹配项,就会从循环中break。另请参阅:并行流。
  • 取决于您的数组列表是排序的还是未排序的。如果它们未排序,则它已经是最接近最佳可能的复杂性。您可以做的一件事是,一旦找到匹配项,立即停止迭代其他元素和return

标签: java android arraylist


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用 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();
      

      【讨论】:

        【解决方案4】:

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

        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

        【讨论】:

          【解决方案5】:

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

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

          但是当没有找到用户时,它会强制你实例化一个用户。

          【讨论】:

            【解决方案6】:

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

            这是最干净的方式:

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

            【讨论】:

            • 这将在两个数组列表中找到用户索引
            猜你喜欢
            • 1970-01-01
            • 2017-09-12
            • 1970-01-01
            • 1970-01-01
            • 2017-01-25
            • 2013-12-21
            • 1970-01-01
            • 1970-01-01
            • 2021-11-16
            相关资源
            最近更新 更多