Как получить вложенные элементы в структуре вложенных списков в Java - PullRequest
2 голосов
/ 26 мая 2019

Я хотел бы получить все вложенные элементы из структуры, которая содержит сами элементы, а также элементы, которые содержат сами элементы: при добавлении элементов в эти списки я не знаю, какой это будет элемент, поскольку я толькодобавление элементов общего типа (называемых SuperItem) в этот список. (SubItem и Item также наследуются от SuperItem)

Например, в конце у меня есть список этих SuperItems, который выглядит следующим образом:

SuperItem [Подэлемент A, Подэлемент B, Элемент C, Подэлемент D]

Хотя Элемент C также содержит подэлементы.Поэтому, если у меня есть вложенная структура, которая выглядит развернутой следующим образом:

UnfoldedSuperItem [SubItem A, SubItem B, SubItem C1, SubItem C2, SubItem C3, SubItem D]

Это список, который я хочу получить.Хотя в настоящее время я могу получить только A, B и D из списка SuperItem, но не C1, C2 и C3 при вызове getAllSubItems().

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, чтобы получить все вложенные элементы.

Также, что здесь важно: Элемент также может содержать элементы сам.Таким образом, список может выглядеть так:

SuperItem [Элемент A, Элемент B, Элемент C, Подэлемент D]

и затем развернутый:

SuperItemUnfolded1 [Элемент A1, элемент A2, подэлемент B1, подэлемент B2, элемент C1, элемент C2, подэлемент D]

и более развернуты:

SuperItemUnfolded2 [Подэлемент A1.1, подэлемент A1.2,Подэлемент A2.1, Подэлемент A2.2, Подэлемент B1, Подэлемент B2, Элемент C1.2 и т. Д. И т. Д.])

1 Ответ

1 голос
/ 26 мая 2019

Возможно, вы ищете что-то вроде этого:

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. Одна вещь, которая мне не ясна - должны ли «элементы» быть уникальными внутри «подсписка» или уникальными во всем объекте «списка списков» ?.Я выбрал первый.

Вас также могут заинтересовать такие коллекции Java, как Словарь , Карта или Набор .

«Набор» может быть особенно полезен для вас:

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

Набор - это Коллекция, которая не может содержать повторяющиеся элементы.Он моделирует абстракцию математического набора.

Интерфейс Set содержит только методы, унаследованные от Collection, и добавляет ограничение, запрещающее дублирование элементов.

Set также добавляет более строгий контракт на поведение равныхи операции hashCode, позволяющие осмысленно сравнивать экземпляры Set, даже если их типы реализации различаются.

...