我作为程序员的最大错误 - For Loops

时间:2018-04-17 11:50:53

标签: java

我认为这是我最大的错误,我开始意识到我在网络应用中已经重复了很多次。

每次我想比较一个List中的属性是否与List的另一个属性相同时,我会进行双循环。

当然,这对我的网站来说并不坏,但一旦拥有数百万用户,它就会开始减速。

这是我的典型错误:

在这种情况下,我有一个List<String>,其中包含已记录用户的用户名,我想将每个用户的完整用户信息返回到前端。

这看起来非常糟糕,因为我需要遍历所有用户,即使我只需要为在线用户获取信息。

任何人都可以帮我这个吗?这是不好的做法吗?我该怎么办?

 @Autowired
private ActiveUsers activeUsers;

 @RequestMapping(value = "/loggedUsers", method = RequestMethod.GET)
public @ResponseBody List<User> getLoggedUsers() {
    List<User> users = User.getUsers();
    List<User> onlineUsers = new ArrayList<>();
    for(User user : users) {
        for(String username : activeUsers.getUsers()) {
            if(username.equals(user.getUsername())) {
                onlineUsers.add(user);
            }
        }
    }
    return onlineUsers;
}

4 个答案:

答案 0 :(得分:4)

使用Map<String,User>。让User.getUsers()返回Map(它应该被缓存,这样您每次调用该方法时都不必生成Map。密钥是用户名,值将是相应的User

现在,嵌套循环可以被一个循环替换:

List<User> getLoggedUsers() {
    Map<String,User> users = User.getUsers();
    List<User> onlineUsers = new ArrayList<>();
    for (String username : activeUsers.getUsers()) {
        User user = users.get(username);
        if(user != null) {
            onlineUsers.add(user);
        }
    }
    return onlineUsers;
}

使用Java 8,可以简化为:

List<User> getLoggedUsers() {
    Map<String,User> users = User.getUsers();
    return activeUsers.getUsers()
                      .stream()
                      .map(users::get)
                      .filter(Objects::nonNull)
                      .collect(Collectors.toList());
}

答案 1 :(得分:0)

for index in indices: input_array = np.insert(input_array, index, 0) 转换为List<User> users(其中密钥为用户名)。然后你可以跳过1 for循环并在O(1)时间获得。

Map<String,User> users

现在,您可以检查单个for循环并检查Map<> myset = User.getUsers(); 是否包含activeUsers

答案 2 :(得分:0)

我是怎么做到的:

@Autowired
private ActiveUsers activeUsers;

@RequestMapping(value = "/loggedUsers", method = RequestMethod.GET)
public @ResponseBody List<User> getLoggedUsers() {
    final List<User> users = User.getUsers();
    final List<User> activeUsersList = activeUsers.getUsers();

    return users.stream()
                .filter(user -> activeUsersList.contains(user))
                .colect(Collectors.toList());
}

使用从Java 8开始可以找到的流非常好并且不难理解。

答案 3 :(得分:0)

使用以下代码行:

Set<User> onlineUsers = users.stream().filter(
    user -> activeUsers.getUsers().contains(user.getUserNmae())).collect(Collectors.toSet());