Основываясь на данном алгоритме и предполагая, что класс Profile
будет иметь дополнительный метод, называемый containsProfile(Profile p)
, который проверяет, содержится ли данный профиль в списке друзей пользователя, должен работать следующий метод грубой силы:
private Map<Profile,List<Profile>> getRecommendedFriends(){
// under the asssumption that vertexProfileMap maps all Profiles/Users
Iterator profileIterator = this.vertexProfileMap.entrySet().iterator();
Map<Profile,List<Profile>> recommendedProfiles = new HashMap<>();
while(profileIterator.hasNext()){
Map.Entry mapElement = (Map.Entry)profileIterator.next();
Profile currentUser = (Profile) mapElement.getValue();
List<Profile> recommendedPerProfile = new ArrayList<>();
// iterate over all of the friends of the current user
for(int i = 0, endI = currentUser.numOfFriends(); i < endI; i++){
Profile checkedFriend = currentUser.getFriend(i);
// iterate over all of the friends of the currently checked friend
for(int j = 0; endJ < checkedFriend.numOfFriends(); j < endJ; ++j) {
Profile possibleRecommendation = checkedFriend.getFriend(j);
// add a recommended profile if it belongs to a friend of a friend, but is not a friend of the current user
if(!currentUser.containsProfile(possibleRecommendation)) {
recommendedPerProfile.add(possibleRecommendation);
}
}
}
// remove possible duplicate recommendations
recommendedProfiles = recommendedProfiles.stream()
.distinct()
.collect(Collectors.toList());
// map the current user to a list of friend recommendations
recommendedProfiles.put(currentUser, recommendedPerProfile);
}
return recommendedProfiles;
}