I have an ArrayList
of ArrayList
s where I need to find a simple way of accessing the elements. To make it easier to understand, I have drawn my goal of what I want to achieve:
As seen on the image above the main ArrayList
consists of m
ArrayList
, where I wish to get an element by using a get
method which goes from 0
to N
elements, where N
is the total elements of ArrayList1
and ArrayList2
. More ArrayList
s may occur.
I can, of course, iterate through the elements by using two for
-loops, that is not what I'm searching for in this case.
You would need to basically have the the ArrayList
members on your new wrapper class and implement them in a different manner. I whipped up an example that demonstrates the correct index being calculated in get()
.
import java.util.ArrayList;
public class ListHolder<T> {
public ArrayList<ArrayList<T>> list = new ArrayList<ArrayList<T>>();
public int size() {
int size = 0;
for (int i = 0; i < list.size(); i++) {
size += list.get(i).size();
}
return size;
}
public T get(int i) {
if (i >= size())
return null;
int listIndex = 0;
int valueIndex = i;
while (valueIndex >= list.get(listIndex).size()) {
valueIndex -= list.get(listIndex++).size();
}
return list.get(listIndex).get(valueIndex);
}
}
What I used to verify my methods:
public static void main(String[] args)
{
ListHolder<Object> listHolder = new ListHolder<Object>();
listHolder.list.add(new ArrayList<Object>());
listHolder.list.get(0).add("hello");
listHolder.list.get(0).add("world");
listHolder.list.add(new ArrayList<Object>());
listHolder.list.get(1).add("a");
listHolder.list.get(1).add("b");
listHolder.list.get(1).add("c");
System.out.println("Size: " + listHolder.size());
System.out.println("listHolder[0]: " + listHolder.get(0)); // "hello"
System.out.println("listHolder[1]: " + listHolder.get(1)); // "world"
System.out.println("listHolder[2]: " + listHolder.get(2)); // "a"
System.out.println("listHolder[3]: " + listHolder.get(3)); // "b"
System.out.println("listHolder[4]: " + listHolder.get(4)); // "c"
System.out.println("listHolder[5]: " + listHolder.get(5)); // "null"
}