java实现查找共同好友

这是一个Java程序,用于实现查找共同好友的功能。程序使用了多种Java集合框架,如ArrayList、HashMap和LinkedHashMap,来处理和存储好友关系数据。通过读取输入数据,它能找出两个用户之间的共同联系人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.doit.java.enhance.day1.example1;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

public class SearchSameFriends {

public static void main(String[] args) throws Exception {

    /**
     * 使用配置文件完成初始化
     */
    Properties p = new Properties();
    p.load(SearchSameFriends.class.getClassLoader().getResourceAsStream("config.properties"));
    String srcPath = p.getProperty("srcPath");

     Map<String, Integer> map1 = sortByFriends(srcPath);
     map1.forE
### 使用Hadoop进行共同好友数据分析的案例 #### 需求描述 通过Hadoop框架实现一个基于MapReduce的数据处理程序,用于计算两个用户之间的共同好友数量。此过程分为多个阶段完成。 --- #### MapReduce设计思路 为了找到用户共同好友,通常需要执行两次MapReduce操作: 1. **第一阶段**: 将原始的好友关系数据转换成适合后续处理的形式。具体来说,将每一对朋友的关系表示为键值对形式 `<好友, 用户>`。 2. **第二阶段**: 对于每一个好友,收集与其关联的所有用户列表,并进一步找出这些用户之间可能存在的共同好友。 --- #### 第一阶段代码示例 以下是第一阶段Mapper类的具体实现方式[^1]: ```java package com.jackyan.mapreduce.sharefriend; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class OneShareFriendsMapper extends Mapper<LongWritable, Text, Text, Text> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 读取输入的一行数据,形如 "A:B,C,D,F,E,O" String line = value.toString(); // 按照 ":" 进行分割,获取用户及其好友列表 String[] fields = line.split(":"); String person = fields[0]; String[] friends = fields[1].split(","); // 构造输出:<好友, 用户> for (String friend : friends) { context.write(new Text(friend), new Text(person)); } } } ``` 在此过程中,每一行被解析为一个人以及他的好友集合,随后将其转化为一系列键值对 `<好友, 用户>` 的形式传递给Reducer。 --- #### 第二阶段代码示例 在第二阶段中,我们需要重新定义Mapper逻辑来生成新的键值对结构[^3]。以下是一个典型的Mapper实现方法: ```java package com.example.step2mapper; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class Step2Mapper extends Mapper<LongWritable, Text, Text, Text> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 输入格式类似于 "<好友>\t<用户>" String[] split = value.toString().split("\t"); String friendStr = split[1]; // 好友对应的用户字符串 // 继续按照 "-" 分割用户字符串 String[] userArray = friendStr.split("-"); // 排序以便后续两两组合 Arrays.sort(userArray); // 构建所有可能的用户配对作为新键 for (int i = 0; i < userArray.length - 1; i++) { for (int j = i + 1; j < userArray.length; j++) { context.write(new Text(userArray[i] + "-" + userArray[j]), new Text(split[0])); } } } } ``` 该Mapper负责接收来自前一阶段的结果,并创建出所有的潜在用户组合,从而便于下一步统计他们的共同好友数。 --- #### Reducer部分说明 对于每个用户组合,在Reducer端会接收到一组共享的好友ID。最终只需简单计数即可得出两者间的公共联系人数目[^2]。 ```java @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { Set<String> commonFriends = new HashSet<>(); for (Text val : values) { commonFriends.add(val.toString()); } StringBuilder result = new StringBuilder(); for (String cf : commonFriends) { result.append(cf).append(","); } if (!result.toString().isEmpty()) { result.setLength(result.length() - 1); // 移除最后一个逗号 } context.write(key, new Text(result.toString())); } ``` 这里采用`Set`去重存储每位共同好友的信息,最后再拼接返回完整的共同好友名单。 --- #### 测试与部署流程概述 整个项目开发完成后需经过如下几个步骤才能正式投入使用: - 创建Java工程项目并配置必要的依赖项; - 编写上述提到的第一、二次MapReduce作业的核心组件; - 打包编译后的JAR文件上传至目标服务器环境; - 准备好测试用样本数据集(例如 `friends.txt`),并通过命令行工具加载到分布式文件系统(HDFS)之上; - 提交任务至YARN调度器运行观察其实际表现效果; 更多细节可参见参考资料中的完整实践指南[^4]。 --- #### 总结 利用Hadoop平台上的MapReduce技术能够高效解决大规模社交网络图谱下的共同好友挖掘问题。它不仅具备良好的扩展性和容错能力,而且非常适合处理海量非结构化或者半结构化的互联网业务场景下产生的复杂交互行为记录。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值