Java不同类中向HashMap添加社交图谱个体的问题求助
错误排查与修正方案
现有代码核心错误点
- SocialGraph无参构造方法语法错误:Java中HashMap初始化不能直接使用
map = ("Nobody", <"noone", "noone else" >)这类非规范写法,需要调用HashMap的put方法插入键值对。 - 带参构造方法未定义泛型:参数
HashMap z缺少类型限定,会触发类型安全警告,需要补全泛型约束。 - 测试类逻辑完全错误:
addIndividual是SocialGraph类的成员方法,不是可实例化的类,不能直接new addIndividual(),需要先创建SocialGraph实例,再通过实例调用方法添加个体、添加关系。 - 缺少添加社交关系的
addKnowsArrow方法:需求要求存储「x认识y」的关系,需要在SocialGraph类中补充该方法实现。
修正后完整代码
SocialGraph.java
import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class SocialGraph { // 存储社交关系图:key为个体名称,value为该个体认识的所有人的列表 private HashMap<String, List<String>> map = new HashMap<>(); // 带参构造方法 public SocialGraph(HashMap<String, List<String>> z) { map = z; } // 无参默认构造方法 public SocialGraph() { // 初始化默认的Nobody节点 List<String> defaultRelations = new ArrayList<>(); defaultRelations.add("noone"); defaultRelations.add("noone else"); map.put("Nobody", defaultRelations); } /** * 向社交图中添加个体 * 如果个体已存在则不做任何操作 */ public void addIndividual(String a) { if (!map.containsKey(a)) { map.put(a, new ArrayList<>()); } } /** * 添加「personA认识personB」的关系 * 如果两个个体不存在会先自动添加到图中 */ public void addKnowsArrow(String personA, String personB) { // 先确保两个个体都在图中 addIndividual(personA); addIndividual(personB); // 给personA的认识列表添加personB,避免重复添加 List<String> knowsList = map.get(personA); if (!knowsList.contains(personB)) { knowsList.add(personB); } } // 可选:打印整个社交图方便调试 public void printGraph() { for (String person : map.keySet()) { System.out.println(person + " 认识的人:" + map.get(person)); } } }
SocialGraphTest.java
public class SocialGraphTest { public static void main(String[] args) { // 1. 先实例化社交图对象 SocialGraph socialGraph = new SocialGraph(); // 2. 添加所有个体 socialGraph.addIndividual("Anne"); socialGraph.addIndividual("Daisy"); socialGraph.addIndividual("Bob"); socialGraph.addIndividual("Charlie"); // 3. 添加「x认识y」的关系 socialGraph.addKnowsArrow("Anne", "Daisy"); socialGraph.addKnowsArrow("Anne", "Bob"); socialGraph.addKnowsArrow("Bob", "Daisy"); socialGraph.addKnowsArrow("Bob", "Charlie"); // 4. 打印结果验证 socialGraph.printGraph(); } }
运行说明
- 实例化SocialGraph对象是所有操作的前提,所有添加个体、添加关系的操作都要通过该实例调用对应方法完成
addKnowsArrow方法自带个体存在性校验,即使忘记提前调用addIndividual添加个体,也会自动补全,不会抛出空指针异常
内容的提问来源于stack exchange,提问作者Tim Davalan
相关产品推荐
相关产品推荐

