簡體   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