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

时间:2019-03-11 04:39:58

标签: java

假设我有一个类似下面的User类,

class User {
  int id;
  String emailAddress; 
} 

并说我有数百万个此类用户的列表。它可以是任何数组或数组列表,也可以是任何东西。

现在,给定具有ID或emailAddress的用户,我如何有效地搜索特定用户,例如通过ID进行搜索或通过emailAddress进行独立搜索。

2 个答案:

答案 0 :(得分:0)

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

  1. 如果要从数据库中获取用户数据,则只需进行两种搜索即可。第一种搜索方法包含用户ID的where子句,另一种搜索方法包含用户电子邮件的where子句。
  2. 如果您没有从数据库中获取用户数据,则可以使用户使用已经实现的各种搜索算法。下图包含一些搜索和排序算法的时间复杂度。但是对我来说,最好先使用合并排序对数据进行排序,然后再使用二进制搜索。

答案 1 :(得分:0)

使用两个地图,一个地图ID到用户,另一个地图电子邮件地址到User,像这样的简单代码:

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