在社交媒体中,假设每个用户的代表如下:
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.
答案 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;
}