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;
}
I have created above function to return the powerset of contiguous elements of a list and each set is of size greater than 2. But due to some unknown problem the list 'st' cannot be added to arraylist of arraylists 'sets' even though the arraylist 'st' prints out fine .
3 Answers 3
The problem is caused by the line sets.add(st);
followed by calling 'st.clear()'. Since Java passes objects by reference, sets
contains the exact object st
. This means that any subsequent change to st
will change the contents of sets
. To avoid this problem, copy st
to a new object before adding it to sets
. Try replacing sets.add(st);
with
sets.add(new ArrayList<Integer>(st));
1 Comment
Try this...
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;
}
Comments
I would implement it this way:
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;
}
cannot be added
mean ?// unable to print
?