如何使用Java Steam在社交媒体中查找连接的朋友

时间:2018-08-03 11:34:37

标签: 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) {
        this.friendsList.add(a);
    }

    int getUserId() {
        return this.userID;
    }

    List<User> getFriendsList() {
        return this.friendsList;
    }
}

如果A和B是朋友(A-> B),则A将被添加到B的朋友列表中,而B将被添加到A的朋友列表中。

A.addFriend(B);
B.addFriend(A);

如何使用Java 8 Steam方法有效地找到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.

2 个答案:

答案 0 :(得分:0)

您实际上不必使用流,而只需使用简单的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;
}

如果您仍想使用流,则可以使用此代码段(尽管仍然使用递归):

boolean isConnected(User a, User b){
    return a.getFriendsList()
        .stream()
        .anyMatch(u -> u.getUserId() == b.getUserId() || isConnected(u, b));
}

答案 1 :(得分:0)

您需要一种方法来跟踪访问过的对象,否则您将陷入循环。

public bool NodeVisited { get;私人订制; }

boolean isConnected(User a, User b){
    for(final User u : a.getFriendsList()){
          if(NodeVisited  == false){
            NodeVisited  = true;
            if(u.getUserId() == b.getUserId() || isConnected(u, b)){
              return true;
            }
            } 
           else continue;
   }
return false;

}