2016-05-24 20 views
1
public static ArrayList<ArrayList<Integer>> powerSet(ArrayList<Integer> originalList) { 
     ArrayList<ArrayList<Integer>> sets = new ArrayList<>(); 

     ArrayList<Integer> list = new ArrayList<Integer>(originalList); 
     int p=2; 
      ArrayList<Integer> st=new ArrayList<>(); 
     while(p<=originalList.size()) 
     { 
      for(int i=0;i<=originalList.size()-p;i++) 
      { 
      for(int j=0;j<p;j++) 
      { 
       st.add(list.get(i+j)); 
      } 
      sets.add(st);// sets recieves a st that is empty which is not the case 
      Iterator it=st.iterator(); 
       System.out.print("adding it to our sets "); 
      while(it.hasNext()) 
        System.out.print(it.next()+" ");// prints the elements contained inside and proves that st is not empty 
       System.out.println(""); 
      st.clear(); 
      } 
      p+=1; 
     } 
     return sets; 
    } 

リストの連続する要素のパワーセットを返すために上記の関数を作成しましたが、各セットのサイズは2より大きくなりました。しかし、 arraylist 'st'がうまく印刷しても、arraylists 'sets'のarraylistに追加することはできません。要素をarraylistに追加できません

+0

'added'何を意味することはできないのでしょうか? – UDKOX

+0

「印刷できません」とは何ですか? – Vampire

+0

私は質問をより明確にするために編集しました。もう一度質問を参照してください。 –

答えて

1

...これを試してみてください。 Javaはオブジェクトを参照渡しするため、setsには正確なオブジェクトstが含まれています。これは、その後にstに変更すると、setsの内容が変更されることを意味します。この問題を回避するには、に追加する前に、stを新しいオブジェクトにコピーしてください。私はそれをこのように実装し sets.add(new ArrayList<Integer>(st));

+0

それは私の問題を解決しました。これはシャドウクローンのようなものでしたか? –

0

は問題が 'st.clearを()' を呼び出すことによって、その後のラインsets.add(st);によって引き起こされる

public static ArrayList<ArrayList<Integer>> powerSet(ArrayList<Integer> originalList) { 
    ArrayList<ArrayList<Integer>> sets = new ArrayList<>(); 
    int p=2; 
    while(p<=originalList.size()) { 
     for(int i=0;i<=originalList.size()-p;i++) { 
      ArrayList<Integer> st=new ArrayList<>(); 
      for(int j=0;j<p;j++) { 
       st.add(list.get(i+j)); 
      } sets.add(st); 
      Iterator it=st.iterator(); 
      System.out.print("adding it to our sets "); 
      while(it.hasNext()) 
       System.out.print(it.next()+" "); 
      System.out.println(""); 
     } 
     p++; 
    } 
    return sets; 
} 
0

sets.add(st);を交換してみてください:

public static ArrayList< ArrayList<Integer> > powerSet(ArrayList<Integer> originalList) { 
    ArrayList< ArrayList<Integer> > sets = new ArrayList<>(); 

    int p=2; 
    while(p <= originalList.size()){ 
     ArrayList<Integer> st; 

     for(int i=0 ; i<=originalList.size()-p ; i++){ 
     for(int j=0;j<p;j++){ 
      st = new ArrayList(); 
      st.add(originalList.get(i+j)); 
     } 

     sets.add(st);// sets recieves a st that is empty which is not the case 
     Iterator it=st.iterator(); 
     System.out.print("adding it to our sets "); 

     while(it.hasNext()) 
       System.out.print(it.next()+" ");// prints the elements contained inside and proves that st is not empty 
      System.out.println(""); 
     st.clear(); 
     } 
     p+=1; 
    } 
    return sets; 
} 
+0

@JPichardoあなたのコードは、最初のものと同じ目標にはならないでしょう:1)私のセットのそれぞれは、最も内側のforループの新しい値で上書きされ、1つの長さだけのセットが得られます2)場合によっては最も内側のforループに入っていないかのように 'st'を初期化するように頼んで、初期化されていないセットのエラーを取得します。 –

関連する問題