2013-04-06 69 views
2

ArrayListArrayList的地方我需要找到访问元素的一个简单的方法,使之更容易理解我画的是什么,我想实现我的目标:访问的ArrayList <ArrayList的<SomeObject>>元素

enter image description here

如所看到的图像上的主要ArrayList以上由ArrayList,其中i希望通过使用get方法,该方法进行到获得元素从0到ñ元素,其中NArrayList1ArrayList2的总元素。更多的ArrayList可能会发生。

我当然可以遍历元素通过使用两个for循环,这不是在这种情况下搜索。

+0

为什么你想避免这种情况下,嵌套循环?复杂? – RaptorDotCpp 2013-04-06 11:17:20

+0

@RaptorDotCpp,我想避免你提到的复杂性。我已经使用嵌套循环,但它使我的应用程序非常缓慢。 – JavaCake 2013-04-06 11:19:46

+5

为什么你需要这样的结构ArrayList的ArrayList,如果你想访问它,就好像它是平坦的呢? – Patashu 2013-04-06 11:21:05

回答

2

您将需要基本对你的新的包装类的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" 
} 
0

您不提供关于这些列表的详细信息,以及它们是否可变。但是,你很可能包含所有子列表中的所有元素的附加列表:

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)); 
    } 
} 
0
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); 
} 
} 
+0

区域语句中的第二个'ArrayList'应该是'List'。泛型类型必须相同。但在Java 7中,只需使用<>。 – 2013-04-06 11:39:48

相关问题