2017-01-14 2 views
2

Я новичок в Java, и я создаю многоуровневое консольное меню. У меня есть Item class, который имеет ArrayList, который может содержать другие элементы с собственными ArrayLists элементов и т. Д.Loop объектов в ArrayLists многоуровневого меню (Java)

public Item(String key, String name, ArrayList<Item> itemList) { 
    this.key = key; 
    this.name = name; 
    this.itemList = itemList; 
} 

мне нужно сделать info() (или любой другой метод) каждый Item во всех массивах (независимо от того, как много вложенных массивов с объектами Пункта мы могли бы). Я писал плохие и не универсальный код, выполняемый метод только в меню 3 уровня ...

public void show() { 
    for (int i = 0; i != list.size(); i++) { 
     System.out.println(list.get(i).info()); 
     if (!list.get(i).getItemList().isEmpty()) { 
      for (int j = 0; j < list.get(i).getItemList().size(); j++) { 
       System.out.println(list.get(i).getItemList().get(j).info()); 
       if (!list.get(i).getItemList().get(j).getItemList().isEmpty()) { 
        for (int y = 0; y < list.get(i).getItemList().get(j).getItemList().size(); y++) { 
         System.out.println(list.get(i).getItemList().get(j).getItemList().get(y).info()); 
        } 
       } 
      } 
     } 
    } 
} 

Результат этого выглядеть:

1. Section one. 
1.1. Sub-Section one. 
1.1.1. Sub-Sub-Section one. 

Есть ли универсальный способ цикла все товары если мы не знаем глубину меню?

ответ

4

Необходимо recursive programming.

Не буду врать, я не программист Java, но вот моя попытка на него:


public void show(List<Item> list) { 
    for (int i = 0; i < list.size(); i++) { 
     System.out.println(list.get(i).info()); 

     if (!list.get(i).getItemList().isEmpty()) { 
      show(list.get(i).getItemList()); 
     } 
    } 
} 

Или с для-каждого:


public void show(List<Item> list) { 
    for (Item item : list) { 
     System.out.println(item.info()); 

     if(!item.getItemList().isEmpty()) { 
      show(item.getItemList()); 
     } 
    } 
} 

Это в основном перебирает исходного списка , затем распечатайте информацию. Если он содержит другой список элементов, перечислите этот список подтемов обратно к себе. Затем он будет проходить через этот список, который вы прошли, и он продолжается до тех пор, пока нет списков дополнительных элементов.

+3

Проверка 'isEmpty' на самом деле не нужна, поскольку она просто не будет зацикливаться, когда она будет пустой. Хотя если 'ItemList' может быть« null », там будет нуль-проверка. – n247s

+0

Спасибо. Ты мне очень помог :) – blackHorsie

-1

Нельсон находится прямо на рекурсивном звонке. Но я чувствую, что базовый случай должен отличаться. Поскольку ArrayList может быть пустым, в то же время он может иметь объект Item, который не является типом ArrayList. Таким образом, рекурсивный вызов завершится неудачно. Пожалуйста, см. Мои встроенные комментарии.

   import java.util.ArrayList; 

     class Item { 
      String key; 
      String name; 
      ArrayList<Item> itemList; 
      static int count = 0; 

      public Item(String key, String name, ArrayList<Item> itemList) { 
       this.key = key; 
       this.name = name; 
       this.itemList = itemList; 
      } 

      public int info() { 
       return count++; 
      } 

      public String getKey() { 
       return key; 
      } 

      public void setKey(String key) { 
       this.key = key; 
      } 

      public String getName() { 
       return name; 
      } 

      public void setName(String name) { 
       this.name = name; 
      } 

      public ArrayList<Item> getItemList() { 
       return itemList; 
      } 

      public void setItemList(ArrayList<Item> itemList) { 
       this.itemList = itemList; 
      } 
     } 

     public class recursiveShow { 
      public static void main(String[] str) { 
       ArrayList<Item> list = new ArrayList<>(); 
       for(int i = 0; i < 10; i++) { 
        ArrayList<Item> list2 = new ArrayList<>(); 
        for(int j = 0; j < 10; j++) { 
         ArrayList<Item> list3 = new ArrayList<>(); 
         Item item = new Item("", "", list3); 
         list2.add(item); 
        } 
        Item item = new Item("", "", list2); 
        list.add(item); 
       } 
       show(list); //wrong one 
       System.out.println("******"); 
       show2(list); // funtion given by Nelson 
      } 

      public static void show2(ArrayList<Item> list) { 
       for (Item item : list) { 
        System.out.println(item.info()); 

        if(!item.getItemList().isEmpty()) { 
         show(item.getItemList()); 
        } 
       } 
      } 

      public static void show(ArrayList<Item> list) { 
        //if you list is empty, size of the list will be 0 
        //And you for loop will not run 
        for (int i = 0; i < list.size(); i++) { 
         if(list.get(i).getClass().getName().equals("Item")) { 
          //Base case for recursion 
          System.out.println(list.get(i).info()); 
         } else { 
          //recursive call 
          show(list.get(i).getItemList()); 
         } 
        } 
       } 
     } 
+1

Это не имеет смысла .. базовый случай - когда список пуст, ничего не происходит. Когда список не пуст, для каждого элемента функция вызывается снова. – NickL

+0

Это будет фактически печатать информацию дважды и никогда не будет делать рекурсивный вызов. (Если элементы в списке не являются подклассами, и если вы правильно выполняете сборку строк!) – n247s

+0

@NickL Да, мой ответ неверен. Я обновил свой код с помощью одного тестового примера. Нельсон кажется мне правдоподобным, но я не понял, почему дается счет 109 для функции Нельсона? Поскольку я добавил только 100 предметов полностью –

Смежные вопросы