为了账号安全,请及时绑定邮箱和手机立即绑定

如何在数百万用户对象的列表中搜索特定用户?

如何在数百万用户对象的列表中搜索特定用户?

慕桂英546537 2022-07-27 20:22:54
假设我有一个像下面这样的用户类,class User {  int id;  String emailAddress; } 假设我有数百万这样的用户的列表。它可以是任何数组或数组列表或任何东西。现在,给定一个具有 id 或 emailAddress 的用户,我如何有效地搜索特定用户,例如按 id 搜索或按 emailAddress 独立搜索。
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

我认为有两种可能的方法可以解决您的问题,两种解决方案都取决于您当前的架构。

  1. 如果您要从数据库中获取用户数据,则只需进行两种搜索方法。第一个搜索方法包含用户 ID 的 where 子句,另一个搜索方法包含用户电子邮件的 where 子句。

  2. 如果您没有从数据库中获取用户数据,那么您可以使用已经实现的各种搜索算法。下图包含一些搜索和排序算法的时间复杂度。但对我来说,最好先使用合并排序对数据进行排序,然后再使用二进制搜索。

//img1.sycdn.imooc.com//62e12e39000105f505000173.jpg

查看完整回答
反对 回复 2022-07-27
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

使用两个映射,一个映射 id 到用户,另一个映射 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()));

    }

}


查看完整回答
反对 回复 2022-07-27
  • 2 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信