2010-11-08 80 views
3

我想實現一個看起來像這樣的數據結構。我該如何實現嵌套的ArrayList?

{{RowID, N1, N2, N3}, 
{RowID, N4, N5, N6}, 
{RowID, N7, N8, N9}} 

而且繼續。它基本上是Java中的3列和RowID表。 我應該使用什麼數據結構,以及如何在代碼中實現它?

+0

你嘗試過什麼?您是否閱讀過Java收集API(提示:Map,HashMap,List,ArrayList)。 – 2010-11-08 17:28:09

回答

2

假設ROWID是一個漫長而列數據是雙打,我會爲實現這個結構:

import java.util.HashMap; 
import java.util.Map; 
... 
Map<Long, Double[]> table = new HashMap<Long, Double[]>();

要存儲一行:

Long rowID = 1234L; 
table.put(rowID, new Double {0.1, 0.2, 0.3});

訪問某一行:

Double[] row = table.get(rowID);

用你想要的任何數據類型Int [],String [],Object [] ...替換Double [] ...

您可以通過這個數據與一個迭代循環:

import java.util.Iterator; 
import java.util.Map.Entry; 
... 
Iterator<Entry<Long, Double[]>> iter = table.entrySet().iterator(); 
while (iter.hasNext()) { 
    Entry entry = iter.next(); 
    rowID = entry.getKey(); 
    row = entry.getValue(); 
};

要重複的順序數據數據被插入,在地方的HashMap的使用LinkedHashMap的。

+0

非常感謝。這幫助了我很多。 – js0823 2010-11-11 21:08:59

1

我會創建一個包含每行數據的bean對象。這比「嵌套ArrayList」有優勢,因爲數據成員是強類型的。

接下來,我會將這些bean插入一個列表,可能是一個LinkedList,除非您知道它們的數量。如果是這樣,我會切換到一個ArrayList。

如果順序不重要,您可以使用HashSet或HashMap,取決於您是僅迭代它們(Set)還是需要通過RowID(Map)執行鍵查找。如果您使用其中一種數據結構,則需要爲您的bean重寫equals()hashCode()

+0

@Jeremy:雖然'ArrayList'通常是指向List的實現,當你沒有具體的如何使用列表的時候,我不會說'LinkedList'幾乎總是一個壞主意。如果你不打算在列表中進行任何隨機訪問,並且將添加或刪除列表中的元素,例如'LinkedList'可能會更快。只需要知道每種類型的不同操作的相對成本以及您將要執行的操作。 – ColinD 2010-11-08 17:57:02

+0

@Jeremy:有參考嗎?我很好奇。 – ColinD 2010-11-08 18:08:38

+0

@Jeremy:查看此[博客文章](http://blog.publicobject.com/2010/07/caliper-confirms-reality-linkedlist-vs.html)和[相應的microbenchmark](http:// microbenchmarks。 appspot.com/run/[email protected]/com.publicobject.blog.ListAsQueueBenchmark)由Jesse Wilson在Google上發佈,它顯示了像我描述的用例,'LinkedList'很容易擊敗'ArrayList'。 – ColinD 2010-11-08 18:14:08

6

有幾種選擇。一種方法是聲明一個代表一行的類。

public class MyRow{ 
    private long rowId; 
    private int col1; 
    private int col2; 
    private int col3; 
    //etc 
} 

顯然你選擇適當的數據類型和變量名稱。

然後您可以創建這種類型的ArrayList:

List<MyRow> rows = new ArrayList<MyRow>(); 

這是,如果列數不會相差特別有用。

+0

Spot on ........ – 2010-11-08 20:58:03

2

您可以使用Map<Integer, ArrayList<MyObject>>,其中地圖的關鍵字是您的RowID。

10

製作ArrayList的ArrayList。例如:

ArrayList<ArrayList> arrayListOfLists = new ArrayList<ArrayList>(); 
arrayListOfLists.add(anotherArrayList); 
//etc... 
+0

這是問題的唯一確切答案。 +1 – 2011-09-30 02:40:40

0

Java提供名單鑄造,因此,例如,你可以在下面的方式做到這一點:

ArrayList<List<someObject>> ArrayListOfLists = new ArrayList<List<someObject>>();