L2-017 人以群分 java
时间: 2025-02-03 15:15:47 浏览: 37
### L2-017 人以群分 Java 编程题解
#### 题目描述
题目要求处理社交网络中的朋友关系,给定一组人的编号以及他们之间的朋友关系列表。需要计算并输出每个人的朋友数量。
#### 解决方案概述
为了高效解决此问题,在Java中可以采用哈希表来存储每个人的编号及其对应的朋友集合。这样可以在O(1)时间内完成查询操作,从而提高整体效率[^2]。
#### 实现细节
以下是具体的实现思路:
1. 使用`HashMap<Integer, Set<Integer>>`结构保存数据,其中键表示某个人的ID,而值则是一个整数集合作为其好友列表;
2. 对于每一对给出的好友关系(a,b),分别向a和b所关联的Set里添加对方作为成员;
3. 最终遍历整个映射表,统计各节点拥有的连接数目即为该顶点度数也就是其好友人数;
下面是完整的Java代码示例:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine()); // 总共n组输入
Map<Integer, Set<Integer>> friendMap = new HashMap<>();
while (n-- > 0){
String line = scanner.nextLine();
String[] parts = line.split("\\s+");
int idA = Integer.valueOf(parts[0]);
int idB = Integer.valueOf(parts[1]);
addFriend(friendMap,idA,idB);
addFriend(friendMap,idB,idA);
}
List<String> result = getResultList(friendMap);
for (String s : result) System.out.println(s);
}
private static void addFriend(Map<Integer, Set<Integer>> map,int key,int value){
if (!map.containsKey(key)){
map.put(key,new HashSet<>());
}
map.get(key).add(value);
}
private static List<String> getResultList(Map<Integer, Set<Integer>> map){
List<Map.Entry<Integer, Set<Integer>>> list = new ArrayList<>(map.entrySet());
Collections.sort(list,(o1,o2)->{
return o1.getKey()-o2.getKey();
});
List<String> resultList = new LinkedList<>();
for (var entry:list){
StringBuilder sb = new StringBuilder(entry.getKey() +" ");
var set = entry.getValue();
List<Integer> sortedFriends = new ArrayList<>(set);
Collections.sort(sortedFriends);
for (Integer i:sortedFriends){
sb.append(i+" ");
}
resultList.add(sb.toString().trim());
}
return resultList;
}
}
```
这段程序首先读取标准输入流中的多行字符串形式的数据,解析为人际关系对,并构建了一个双向图模型用于记录这些联系。之后按照题目要求整理输出结果,确保按升序排列的人编号顺序打印出各自的朋友列表。
阅读全文
相关推荐


















