2 回答

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
我認(rèn)為有兩種可能的方法可以解決您的問題,兩種解決方案都取決于您當(dāng)前的架構(gòu)。
如果您要從數(shù)據(jù)庫中獲取用戶數(shù)據(jù),則只需進(jìn)行兩種搜索方法。第一個(gè)搜索方法包含用戶 ID 的 where 子句,另一個(gè)搜索方法包含用戶電子郵件的 where 子句。
如果您沒有從數(shù)據(jù)庫中獲取用戶數(shù)據(jù),那么您可以使用已經(jīng)實(shí)現(xiàn)的各種搜索算法。下圖包含一些搜索和排序算法的時(shí)間復(fù)雜度。但對(duì)我來說,最好先使用合并排序?qū)?shù)據(jù)進(jìn)行排序,然后再使用二進(jìn)制搜索。

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
使用兩個(gè)映射,一個(gè)映射 id 到用戶,另一個(gè)映射 emailAddress 到用戶,簡單代碼如下:
public class UserCache {
Map<Integer, List<User>> id2User = new ConcurrentHashMap<>();
Map<String, List<User>> email2User = new ConcurrentHashMap<>();
public void initMaps(List<User> users) {
id2User.putAll(users.stream()
.collect(Collectors.groupingBy(User::getId)));
email2User.putAll(users.stream()
.collect(Collectors.groupingBy(User::getEmailAddress)));
}
public List<User> getUsersById(String id) {
return id2User.get(id);
}
public List<User> getUserByEmail(String email) {
return email2User.get(email);
}
public void deleteUserById(String id) {
List<User> users = id2User.remove(id);
users.stream()
.forEach(user -> email2User.remove(user.getEmailAddress()));
}
public void deleteUserByEmail(String email) {
List<User> users = email2User.remove(email);
users.stream()
.forEach(user -> id2User.remove(user.getId()));
}
}
添加回答
舉報(bào)