前言
当需要有两个或者多个列表循环来获取所需值时,应考虑列表多层循环带来的时间复杂度,这篇文章记录我的解决方法。
解决方案
当需要多个列表循环获取所需列表或值时:
List<User> userList = new ArrayList<User>();
List<Score> scoreList = new ArrayList<Score>();
此时我们需要判断哪些人考试了:
//转换为Map,减少时间复杂度(stream流为Java8新特性)
Map<Integer, User> collect = data.stream().collect(Collectors.toMap(User::getId, user-> user));
此时我们已经将用户列表转换为了一个以用户ID为键,以用户为值的Map;
List<User> testsUser = new ArrayList<User>();
for (Score score : scoreList) {
User user = collect.get(score.getUserId());
if (!ObjectUtils.isEmpty(user)){
testsUser.add(user);
}
}
这个时候我们就拿到了拥有成绩的用户,且时间复杂度比双层循环要低得多。