Этот вопрос относится к рекурсии. Рассмотрим программу, показанную ниже (не мой настоящий код, но это объясняет мою проблему).
Функция должна использовать рекурсию, как показано, и я хочу, чтобы каждое конечное значение вместо вывода на печать сохранялось в списке. Итак, наконец, я получаю List<String>
, который при распечатке дает мне содержимое каждого листового узла.
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<title text=\"title1\">\n" +
" <comment id=\"comment1\">\n" +
" <data> abcd </data>\n" +
" <data> efgh </data>\n" +
" </comment>\n" +
" <comment id=\"comment2\">\n" +
" <data> ijkl </data>\n" +
" <data> mnop </data>\n" +
" <data> qrst </data>\n" +
" </comment>\n" +
"</title>\n";
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xml)));
List<String> results = traverse(doc.getFirstChild());
//Want to print out results list here...
public static List<String> traverse(Node node){
System.out.println(node.getNodeName());
for(int i = 0; i < node.getChildNodes().getLength(); i++){
traverse(node.getChildNodes().item(i));
}
return null;
}
Итак, мой вопрос: как я могу переписать функцию обхода таким образом, чтобы она по-прежнему использовала рекурсию, но сохраняла все листовые узлы в списке. А затем он возвращает список всех значений.
3 ответа
Он хранит в списке те же строки, которые вы печатаете с помощью функции обхода, и вам не нужно передавать список в качестве аргумента:
public static List<String> traverse( Node node ) {
List<String> results = new LinkedList();
results.add(node.getNodeName());
if ( node.getChildNodes().getLength() > 0 ) {
for ( int i = 0; i < node.getChildNodes().getLength(); i++ )
results.addAll(traverse(node.getChildNodes().item(i)));
}
return results;
}
Вы можете либо вернуть список и добавить элементы из рекурсивных вызовов в список результатов текущего вызова, либо передать список в качестве параметра и напрямую добавить результат.
Я думаю, что вам нужно что-то вроде этого:
public static void traverse(Node node, List<String> results) {
if (node.getChildNodes().getLength() == 0) {
// leaf node
results.add(node.getNodeValue());
}
else {
// walk all children
for (int i = 0; i < node.getChildNodes().getLength(); i++) {
traverse(node.getChildNodes().item(i));
}
}
}
public static List<String> traverse(Node node) {
List<String> result = new LinkedList<String>();
traverse(node,result);
return result;
}
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].