我想从一个包含项目本身以及包含项目本身的项目的结构中获取所有嵌套项目: 将项目添加到此列表时,我不知道它将是哪种项目,因为我只是将常规类型的项目(称为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等)]
答案 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;
}
}
详细信息会根据您要完成的操作而有所不同,但是基本上听起来像您:
您可能还对Dictionary,Map或Set之类的Java集合感兴趣。
“设置”可能对您特别有帮助:
https://www.tutorialspoint.com/java/java_set_interface.htm
集合是一个不能包含重复元素的集合。它 对数学集合抽象进行建模。
Set接口仅包含从Collection和 添加了禁止重复元素的限制。
Set还对等号和 hashCode操作,允许比较Set实例 即使它们的实现类型不同,也有意义。