Graph 如何使用java steam在社交媒体中找到有联系的朋友
在社交媒体中,假设每个用户都有如下表示:Graph 如何使用java steam在社交媒体中找到有联系的朋友,graph,java-8,java-stream,connected-components,Graph,Java 8,Java Stream,Connected Components,在社交媒体中,假设每个用户都有如下表示: public class User { private int userId; private List<User> friendsList; User(int id) { this.userID = id; this.friendsList = new LinkedList<>(); } void addFriend(User a) {
public class User {
private int userId;
private List<User> friendsList;
User(int id) {
this.userID = id;
this.friendsList = new LinkedList<>();
}
void addFriend(User a) {
this.friendsList.add(a);
}
int getUserId() {
return this.userID;
}
List<User> getFriendsList() {
return this.friendsList;
}
}
如何使用Java8STEAM方法有效地找到连接X和Y的两个用户
即如果X->p->q->r->s->Y,那么
bool isConnected(User X, User Y) should return true
Here X and Y are connected through common friends p, q, r and s.
您实际上不必使用流,只需使用一个简单的for循环和递归:
boolean isConnected(User a, User b){
for(final User u : a.getFriendsList()){
if(u.getUserId() == b.getUserId() || isConnected(u, b)){
return true;
}
}
return false;
}
如果仍要使用流,可以使用此代码段(但仍使用递归):
您的问题是关于流,还是一般算法?如果没有流,你会怎么做呢?我特别想知道如何使用java流。如果有一百万用户,那么我们使用java streams找到它的效率有多高。您的非流解决方案是什么样子的?你为什么要改进它?这并不是真正适合流的。您绝对需要添加一个参数来限制连接级别,例如,在6级停止reaserach之后。如果你不这样做,复杂性是指数级的,你也可以改变数据结构中的某些东西你的非流解决方案是什么?这并不是问题的答案-你不是在检查一个图表看它们是否连接,而是在检查列表列表。这可能导致堆栈溢出-检查用户a的朋友列表,检查用户B,然后检查用户a,然后检查B,然后检查a,依此类推
boolean isConnected(User a, User b){
for(final User u : a.getFriendsList()){
if(u.getUserId() == b.getUserId() || isConnected(u, b)){
return true;
}
}
return false;
}
boolean isConnected(User a, User b){
return a.getFriendsList()
.stream()
.anyMatch(u -> u.getUserId() == b.getUserId() || isConnected(u, b));
}