2017-01-14 5 views
2

私はJavaを初めて使い、多レベルのコンソールメニューを作っています。私はItem classを持っています。これにはArrayListがあり、Itemsの独自のArrayListsを持つ別のItemを含むことができます。マルチレベルメニュー(Java)のArrayLists内のオブジェクトのループ

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

は、私はすべてのアレイ内の各Iteminfo()(またはその他の方法)(Itemオブジェクトを持つ多くのネストされた配列は、我々が持っている可能性がどのように関係なく)を行う必要があります。私は

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()); 
        } 
       } 
      } 
     } 
    } 
} 
に...唯一の3レベルのメニューのメソッドを実行するいくつかの悪いと普遍的ではないコードを書いたことの結果は次のようになります。

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()); 
     } 
    } 
} 

は、ORのために、それぞれに:


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

Nelsonは再帰呼び出しで正しく機能します。しかし、基本的なケースは違うべきだと感じます。 ArrayListは空ではないので、ArrayList型ではないItemオブジェクトを持つ可能性があります。したがって、再帰呼び出しは失敗します。私のインラインコメントを見てください。

   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

これは実際に情報を2回印刷し、決して再帰呼び出しを行いません。 (リスト内の項目がサブクラスでない場合、正しくストリングを比較する場合) – n247s

+0

@NickLはい私の答えは間違っています。 1つのテストケースでコードを更新しました。ネルソンは私には正しいようですが、なぜネルソンの機能として109を数えるのか理解できませんでしたか? 100アイテムだけを追加したので –

関連する問題