
在实际开发中,我们经常需要对数据结构进行转换以适应不同的业务逻辑或查询需求。假设我们有一个map<string, list<user>>类型的数据,其中键(string)代表项目名称,值(list<user>)代表与该项目关联的用户列表。例如:
Map<String, List<User>> projectToUsersMap = new HashMap<>();
projectToUsersMap.put("projectA", Arrays.asList(new User(1,"Bob"), new User(2,"John"), new User(3,"Mo")));
projectToUsersMap.put("projectB", Arrays.asList(new User(2,"John"), new User(3,"Mo")));
projectToUsersMap.put("projectC", Arrays.asList(new User(3,"Mo")));我们的目标是将这个映射转换为Map<User, List<String>>类型,其中键(User)代表一个独立的用户,值(List<String>)代表该用户所参与的所有项目名称列表。期望的输出效果如下:
Bob = [projectA] John = [projectA, projectB] Mo = [projectA, projectB, projectC]
这种转换在需要根据用户查询其参与项目列表的场景中非常有用。
实现这一转换的核心思路是遍历原始映射中的每一个条目(Entry),然后针对每个条目,再遍历其值(即用户列表)。对于遍历到的每一个用户,我们需要将其作为新映射的键,并将当前项目的名称添加到该用户对应的项目列表中。
具体步骤如下:
立即学习“Java免费学习笔记(深入)”;
以下是实现上述转换的完整Java代码示例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class UserProjectMapper {
// 定义User记录类,自动生成equals(), hashCode(), toString()
public static record User(int id, String name) {}
public static void main(String[] args) {
// 原始数据:项目到用户列表的映射
Map<String, List<User>> projectToUsersMap = new HashMap<>();
projectToUsersMap.put("projectA", Arrays.asList(new User(1,"Bob"), new User(2,"John"), new User(3,"Mo")));
projectToUsersMap.put("projectB", Arrays.asList(new User(2,"John"), new User(3,"Mo")));
projectToUsersMap.put("projectC", Arrays.asList(new User(3,"Mo")));
// 用于存储转换结果的新映射:用户到项目列表的映射
Map<User, List<String>> userToProjectsMap = new HashMap<>();
// 遍历原始映射的每个条目
for (Map.Entry<String, List<User>> entry : projectToUsersMap.entrySet()) {
String projectName = entry.getKey(); // 获取当前项目名称
List<User> usersInProject = entry.getValue(); // 获取当前项目下的用户列表
// 遍历当前项目下的每个用户
for (User user : usersInProject) {
// 如果用户在新映射中不存在,则为其创建一个新的项目列表
userToProjectsMap.putIfAbsent(user, new ArrayList<>());
// 将当前项目名称添加到该用户对应的项目列表中
userToProjectsMap.get(user).add(projectName);
}
}
// 打印转换后的结果
System.out.println("转换后的映射 (User -> List<String>):");
userToProjectsMap.forEach((user, projects) ->
System.out.println(user.name() + " = " + projects)
);
// 打印完整的Map对象
System.out.println("\n完整的Map对象表示:");
System.out.println(userToProjectsMap);
}
}public static record User(int id, String name) {}:
Map<User, List<String>> userToProjectsMap = new HashMap<>();:
外层循环 for (Map.Entry<String, List<User>> entry : projectToUsersMap.entrySet()):
内层循环 for (User user : usersInProject):
userToProjectsMap.putIfAbsent(user, new ArrayList<>());:
userToProjectsMap.get(user).add(projectName);:
执行上述代码,将得到以下输出:
转换后的映射 (User -> List<String>):
Bob = [projectA]
John = [projectA, projectB]
Mo = [projectA, projectB, projectC]
完整的Map对象表示:
{User[id=1, name=Bob]=[projectA], User[id=2, name=John]=[projectB, projectA], User[id=3, name=Mo]=[projectB, projectA, projectC]}这完美地实现了将项目到用户的映射转换为用户到项目的映射,每个用户都关联了其参与的所有项目。
本教程展示了如何通过迭代和条件插入(putIfAbsent)的方式,将一个复杂的嵌套Map数据结构高效地转换为另一种满足特定查询需求的数据结构。理解并正确运用Map的equals()和hashCode()方法(或使用record类型自动处理)是处理自定义对象作为Map键的关键。这种数据重构技术在处理多对多关系的数据时非常实用,有助于简化后续的数据查询和业务逻辑实现。
以上就是Java数据结构转换:从项目-用户映射到用户-项目映射的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号