2013-04-06 74 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

相關問題