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