我有一个ArrayList
of ArrayList
s,我需要找到一种访问元素的简单方法,以便更容易理解我已经制定了我想要实现的目标:
如上图所示,主要ArrayList
由m ArrayList
组成,我希望通过使用get
从 0 到N个元素的方法来获取一个元素,其中N是ArrayList1
and的总元素ArrayList2
。可能会出现更多的 ArrayList。
我当然可以通过使用两个 for 循环来遍历元素,这不是我在这种情况下搜索的内容。
我有一个ArrayList
of ArrayList
s,我需要找到一种访问元素的简单方法,以便更容易理解我已经制定了我想要实现的目标:
如上图所示,主要ArrayList
由m ArrayList
组成,我希望通过使用get
从 0 到N个元素的方法来获取一个元素,其中N是ArrayList1
and的总元素ArrayList2
。可能会出现更多的 ArrayList。
我当然可以通过使用两个 for 循环来遍历元素,这不是我在这种情况下搜索的内容。
您基本上需要在ArrayList
新包装类上拥有成员并以不同的方式实现它们。我创建了一个示例来演示在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);
}
}
我用来验证我的方法的内容:
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"
}
您没有提供有关这些列表是什么以及它们是否可变的许多详细信息。但是您可能可以使用包含所有子列表的所有元素的附加列表:
private class Generation
private List<List<Element>> populations = new ArrayList<>();
private List<Element> allElements = new ArrayList<>();
public Element getElementAt(int elementIndex) {
return allElements.get(elementIndex);
}
public void addPopulation(List<Element> population) {
populations.add(new ArrayList<>(population));
allElements.addAll(population);
}
public List<Element> getPopulationAt(int populationIndex) {
return Collections.unmodifiableList(populations.get(populationIndex));
}
}
class Plot {
class Point {
int x;
int y;
}
List<List<Point>> area = new ArrayList<List<Point>>();
Point getPoint (int x, int y) throws IndexOutOfBoundsException {
if (x < 0 && x >= area.size())
throw new IndexOutOfBoundsException();
int l = area.get(x).size();
int i = (int)y/l;
int j = y % l;
return area.get(x+i).get(j);
}
void setPoint (int x, int y, Point p) throws IndexOutOfBoundsException {
if (x < 0 && x >= area.size())
throw new IndexOutOfBoundsException();
int l = area.get(x).size();
int i = (int)y/l;
int j = y % l;
area.get(x+i).set(j, p);
}
}