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));
}