当前位置: 首页 > 知识库问答 >
问题:

获取递归嵌套结构的所有叶子元素java中的数据

潘宸
2023-03-14

有人能帮我如何在java中得到递归嵌套结构的所有叶子元素数据吗?

public class Item {
    private String id;
    private List<Item> items;
}

例如:

    A
      - AA
        - aa1
      - AB
        - ab1
          - abab1 
      - a1

后果

在结果中,我只需要得到以下元素列表[aa1,abab1,a1]

首先,感谢您的帮助。

共有3个答案

顾乐心
2023-03-14

这个怎么样:

public class TestTest {

    public static class Item {
        private final String id;
        private final List<Item> items;

        public Stream<Item> getLeaves() {
            if (items == null || items.isEmpty()) {
                return Stream.of(this);
            }
            return items.stream()
                .flatMap(Item::getLeaves);
        }

    }

    public static void main(String[] args) {
        final var item = new Item(
            "A",
            List.of(
                new Item("AA",
                    List.of(new Item("aa1"))
                ),
                new Item("AB",
                    List.of(new Item("ab1",
                        List.of(new Item("abab1")))
                    )
                ),
                new Item("a1")
            )
        );

        final var leaves = item.getLeaves()
            .map(Item::getId)
            .collect(Collectors.toList());

        System.out.println(leaves);
    }
}

注意:为简洁起见,省略了构造函数和getters

秦鸿羽
2023-03-14

尝试将此方法添加到类:

public List<Item> getLeaves() {
    ArrayList<Item> list = new ArrayList<>();
    if (items.size() == 0) {
        list.add(this);
    } else {
        for (Item item : items) {
            list.addAll(item.getLeaves());
        }
    }
    return list;
}

它只是检查自己是否是一片叶子。如果是,它返回自己,如果不是,它返回它孩子的所有叶子。

沈永新
2023-03-14

你可以用递归的方式很容易地做到:

public static List<Item> findLeaves(Item rootItem){
    List<Item> leaves = new ArrayList<>();
    recursivelyCollectLeaves(leaves, rootItem);
    return leaves;
}

private static void recursivelyCollectLeaves(List<Item> leaves, Item actualItem){
    if(actualItem.getItems().isEmpty()){
        //No children, the actual item is a leaf
        leaves.add(actualItem);
    }
    else{
        for(Item child : actualItem.getItems()){
            recursivelyCollectLeaves(leaves, child);
        }
    }
}

PS:为了让这段代码正常工作,请注意我在Item类中添加了getter。

 类似资料:
  • 问题内容: 在带有Python的Selenium中,是否可以将WebElement的所有子级作为列表获取? 问题答案: 是的,您可以通过或实现。 但是,这听起来并不像查找某个元素的 所有子 元素的有效用例。要获得所有直接/间接孩子都是昂贵的手术。请进一步说明您要做什么。应该有更好的方法。

  • 在Selenium和Python中,是否可以将WebElement的所有子元素作为列表?

  • 问题内容: 如何递归选择所有子元素? 此类仅在定义的className和所有直接子级上抛出一个类。您如何以一种简单的方式选择所有子节点,如下所示: 问题答案: 使用 空格 匹配元素的所有后代: 匹配 x 内的每个元素 y ,无论它嵌套在多深处-孩子,孙子等等。 __ 星号匹配任何元素。 官方规范:CSS2.1:第5.5章:后代选择器

  • 但是querySelectorAll(“:not([foo])”)仍然会返回未选定元素的子元素。

  • 我一直在用这个四叉树http://www.astroml.org/book_figures/chapter2/fig_quadtree_example.html 在一些数据上。但是我现在需要结果结构的嵌套表示。 其结构类似于: 这里的子元素是递归元素,它是一个列表,包括进一步的实例。最低深度没有子级(为0),是我想要访问的表示。因此,在这种情况下,我会访问数据 最终,我希望在最低级别的数据表示像:

  • 问题内容: 这是我想要做的事情:-我需要一个函数,当将其作为参数传递时,ID(用于事物类别)将提供所有子类别,子子类别和子子子..etc 。-我在考虑使用递归函数,因为我不知道子类别及其子类别的数量,依此类推,这是到目前为止我一直在尝试的操作 如果我使用return而不是echo,我将不会得到相同的结果。我需要一些帮助以解决此问题或从头开始重写它 问题答案: 我很难弄清楚你的职能。我认为这会做您想