I need to implement a 2D dynamic array. The number of rows is fixed, say n. But the number of columns for each row is not fixed and equivalent. For instance, the first row has 3 elements and the second row has 5 elements. How to do this in Java using Arraylist. Thanks.
9 Answers
How about List<List<Foo>> ?
For Example:
List<List<Foo>> list = new ArrayList<List<Foo>>();
List<Foo> row1 = new ArrayList<Foo>();
row1.add(new Foo());
row1.add(new Foo());
row1.add(new Foo());
list.add(row1);
List<Foo> row2 = new ArrayList<Foo>();
row2.add(new Foo());
row2.add(new Foo());
list.add(row2);
2 Comments
List is an interface , ArrayList is its specific implementation. well if you have List<Foo> then you can refer to an LinkedList or some other implementation alsoArrayList<ArrayList<SomeObject>> twodlist = new ArrayList<ArrayList<SomeObject>>();
ArrayList<SomeObject> row = new ArrayList<SomeObject>();
row.add(new SomeObject(/* whatever */));
// etc
twodlist.add(row);
row = new ArrayList<SomeObject>();
// etc
You can either use a array for the rows since this dimenstion is fixed:
@SuppressWarnings("unchecked")
ArrayList<T>[] arr = new ArrayList[ fixedsize];
or use nested ArrayLists:
List<List<T>> list = new ArrayList<List<T>>( fixedsize );
5 Comments
ArrayList<ArrayList<T>> can technically hold any object you like and you can manage to put a string in it although you would need to use some nasty casts or reflection to do this. Apart from that the type safety or lack thereof is the same for arrays and collection types.Try:
ArrayList<ArrayList<DataType>> array = new ArrayList<ArrayList<DataType>>();
for (int i = 0; i < n; ++i) {
array.add(new ArrayList<DataType>());
}
8 Comments
@SuppressWarnings("unchecked"), but you're discouraged to.array.get(rowNumber).add(element) (like in my answer)You could create an array of ArrayList elements because your row count is fixed.
ArrayList[] dynamicArray = new ArrayList[n]();
Note: You'll need to allocate an ArrayList object in each entry in the array. So...
for (int loop = 0; loop < n; loop++)
dynamicArray[loop] = new ArrayList();
OR if you'd like both rows and columns to be dynamic you could create an ArrayList of ArrayLists....
ArrayList<ArrayList<T>> dynamicArray = new ArrayList<ArrayList<T>>();
Once again, you'll need to create an array list in each new entry to dynamicArray.
Comments
if the number of rows is fixed, try something like this:
ArrayList<MyObject>[] = new ArrayList<MyObject>[fixedRows]
4 Comments
@SuppressWarnings("unchecked") for that to always work.ArrayList[] = new ArrayList[fixedRows]. Suck it Java.I would create an array of ArrayList (ArrayList[3] rows = new ArrayList[3] if the rows were 3) Then for each row create column classes and insert them into an ArrayList. and then place the ArrayList into the Array. the row array's index can be used to keep track of the row number. Remember arrays start there indexes at 0 so the row number would be rows[index+1]
Comments
As you say, you can make an array of arraylists and use the ArrayList(int initial capacity) constructor to set the capacity of each column:
ArrayList<YourObject>[] rows=new ArrayList<YourObjects>[n];
for(i=0;i<n;i++){
rows[i]=ArrayList<YourObjects>(initialsize);
}
3 Comments
ClassCastException.
Something[][] s = new Something[numRows][]ands[0] = new Something[3]?