Имеется список друзей, каждый из который является объектом типа User:
package Graph;
import java.util.List;
public class User {
String userId;
String firstName;
String secondName;
String surname;
String job;
List<String> friendListId;
}
Из данных объектов формируется хеш-таблица вида (
идентификатор_юзера, соответствующий объект). Из данной хеш-таблицы формируется социальный граф друзей.
Имеется класс FriendGraph, который реализует поиск в ширину в графе. Идет поиск объектов, у которых атрибут
job имеет значение "No info". Код класса:
package Graph;
import java.util.*;
public class FriendGraph {
private Map<String, User> usersMap;
public FriendGraph(){
usersMap = new HashMap<>();
}
public void addUser(User user){
usersMap.put(user.userId, user);
}
public User getUserById(String userId){
return usersMap.get(userId);
}
public List<User> findUsersWithJob(String jobValue, String startUserId){
List<User> result = new ArrayList<>();
Queue<String> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
queue.add(startUserId);
visited.add(startUserId);
for (User user : usersMap.values()){
if (!visited.contains(user.userId)){
queue.add(user.userId);
visited.add(user.userId);
while (!queue.isEmpty()){
String currentUserId = queue.poll();
User currentUser = usersMap.get(currentUserId);
if(currentUser.job.contains(jobValue)){
result.add(currentUser);
}
for (String friendId : currentUser.friendListId){
if (!visited.contains(friendId)){
queue.add(friendId);
visited.add(friendId);
}
}
}
}
}
return result;
}
}
Вопрос: почему данный код вообще работает, если стартовая вершина добавляется в множество уникальных значений
visited. Ведь данное условие
if (!visited.contains(user.userId)){
не должно срабатывать и программа не должна получить доступ к списку друзей вершины