В этой части кода есть ошибка
for (Node temp : n.getChildren()) {
if (temp.getChildren().size() > 0) {
if (isContained(temp, p)) {
list.add(temp.getId());
return list;
} else {
getAllNodesForPoint(temp, p, list);
}
} else {
list = new LinkedList<>();
list.add(n.getId());
}
}
list = new ArrayList<>();
return list;
Мы можем использовать пример, приведенный в вашем заявлении о проблеме, чтобы объяснить то же самое.
Пример:
{"id": "root" ,
"left": 0 ,
"top": 0 ,
"width": 33 ,
"height": 23 ,
"children": [{
"id": "child-0" ,
"left": 5 ,
“top": 5 ,
"width": 20 ,
"height": 10 ,
"children": []},
{"id": "child-1" ,
"left": 10 ,
"top": 10 ,
"width": 20 ,
"height": 10 ,
"children": []
}
]}
Он начинается с узла root
и в его массиве children
есть два дочерних элемента child-0
и child-1
. Из-за этого он будет go в этой части кода
for (Node temp : n.getChildren())
Теперь этот for
l oop будет выполняться 2 раза, поскольку есть два дочерних элемента узла root
.
Но каждый дочерний массив children
пуст, поэтому он не сможет набрать go в этом коде кода:
if (temp.getChildren().size() > 0)
, вместо этого он будет go в части else
. Но первый выпуск здесь. Здесь вы каждый раз инициализируете список массивов и добавляете этот дочерний идентификатор. Итак, когда l oop запускается в первый раз для child-1
, он создаст новый список с этим
list = new LinkedList<>();
и добавит к нему child-1
. и в следующий раз он снова запустится для child-2
, переинициализирует список и добавит к нему child-2
.
Итак, в конце for
l oop в нашем списке у нас будет только 1 запись child-2
.
Но в результате вы получаете пустой список, потому что после окончания для l oop вы снова повторно инициализировали список и возвращаете пустой список. Это вторая проблема .
list = new ArrayList<>();
return list;
Исправленный код getAllNodesForPoint
равен
list.add(n.getId());
for (Node temp : n.getChildren()) {
if (temp.getChildren().size() > 0) {
if (isContained(temp, p)) {
list.add(temp.getId());
return list;
} else {
getAllNodesForPoint(temp, p, list);
}
} else {
list.add(temp.getId());
}
}
return list; }