如何在Java中的嵌套列表结构中获取嵌套项

时间:2019-05-26 19:54:39

标签: java list nested-lists

我想从一个包含项目本身以及包含项目本身的项目的结构中获取所有嵌套项目: 将项目添加到此列表时,我不知道它将是哪种项目,因为我只是将常规类型的项目(称为SuperItem)添加到此列表中。 (SubItem和Item也从SuperItem继承)

例如,最后我有一个SuperItems列表,如下所示:

SuperItem [SubItem A,SubItem B,Item C,SubItem D]

尽管如此,Item C还包含SubItems。因此,如果我有一个看起来像这样展开的嵌套结构:

UnfoldedSuperItem [子项目A,子项目B,子项目C1,子项目C2,子项目C3,子项目D]

这是我想退回的清单。不过,目前在调用getAllSubItems()时只能从SuperItem List中获得A,B和D,而不能从C1,C2和C3中获得。

public class Item extends SuperItem{
    List<SuperItem> superItems;
    List<SubItem> subItems;

    public Item() {
        super();
        superItems = new LinkedList<>();
        subItems = new LinkedList<>();
    }


    public void addItem(SuperItem s) {
        if (!superItems.contains(s))    {
            superItems.add(s);
        }
    }

    //[... a remove method is also in this class, not included here as not in scope]

    public List<subItem> getAllSubItems() {
        for (superItem s: superItems) {
            if (s.getClass() == SubItem.class) {
                if (!subItems.contains(s)) {
                    subItems.add((SubItem) s);
                }
            } else {
                //if it is a item, somehow call the method getAllSubItems() on itself
            }
        }
        return subItems;
    }
}

这里唯一缺少的是当我来到这个不是子项目的C-Item时。我有点想解开C以获得所有嵌套项。

这里重要的是: Item也可以包含Items本身。因此,列表也可能如下所示:

SuperItem [项目A,项目B,项目C,子项目D]

然后展开:

SuperItemUnfolded1 [项目A1,项目A2,子项目B1,子项目B2,项目C1,项目C2,子项目D]

然后展开:

SuperItemUnfolded2 [SubItem A1.1,SubItem A1.2,SubItem A2.1,SubItem A2.2,SubItem B1,SubItem B2,Item C1.2等)]

1 个答案:

答案 0 :(得分:1)

也许您正在寻找这样的东西:

public class SuperItem {
   List<Item> superItems = new LinkedList<Item>();
   List<Item> currentSubItems = null;


   public void addItem(Item s, boolean isNewSublist) {
      if (isNewSublist || currentSubItems == null) {
         currentSubItems = new LinkedList<Item>();
         superItems.add(currentSubItems);
      }
      if (!currentSubItems.contains(s))    {
         currentSubItems.add(s);
      }
      ...
   }

   public List<Item> getAllSubItems() {
      List<Item>subItems = new List<Item>();
      for (List<Item> superItem : superItems) {
         for (Item item : superItem.subItems) {
      ...
      return subItems;
   }
}

详细信息会根据您要完成的操作而有所不同,但是基本上听起来像您:

  1. 想要一个包含“项目”的列表列表。
  2. 您要将这个“列表列表”封装在一个类中。
  3. 该类应提供“添加”项目和“列出”项目的方法。
  4. 我不清楚的一件事-“项目”在“子列表”中应该是唯一的,还是在整个“列表列表”对象中是唯一的?我选择了前者。

您可能还对DictionaryMapSet之类的Java集合感兴趣。

“设置”可能对您特别有帮助:

  

https://www.tutorialspoint.com/java/java_set_interface.htm

     

集合是一个不能包含重复元素的集合。它   对数学集合抽象进行建模。

     

Set接口仅包含从Collection和   添加了禁止重复元素的限制。

     

Set还对等号和   hashCode操作,允许比较Set实例   即使它们的实现类型不同,也有意义。