我想實現一個看起來像這樣的數據結構。我該如何實現嵌套的ArrayList?
{{RowID, N1, N2, N3},
{RowID, N4, N5, N6},
{RowID, N7, N8, N9}}
而且繼續。它基本上是Java中的3列和RowID表。 我應該使用什麼數據結構,以及如何在代碼中實現它?
我想實現一個看起來像這樣的數據結構。我該如何實現嵌套的ArrayList?
{{RowID, N1, N2, N3},
{RowID, N4, N5, N6},
{RowID, N7, N8, N9}}
而且繼續。它基本上是Java中的3列和RowID表。 我應該使用什麼數據結構,以及如何在代碼中實現它?
假設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的。
非常感謝。這幫助了我很多。 – js0823 2010-11-11 21:08:59
我會創建一個包含每行數據的bean對象。這比「嵌套ArrayList」有優勢,因爲數據成員是強類型的。
接下來,我會將這些bean插入一個列表,可能是一個LinkedList,除非您知道它們的數量。如果是這樣,我會切換到一個ArrayList。
如果順序不重要,您可以使用HashSet或HashMap,取決於您是僅迭代它們(Set)還是需要通過RowID(Map)執行鍵查找。如果您使用其中一種數據結構,則需要爲您的bean重寫equals()
和hashCode()
。
@Jeremy:雖然'ArrayList'通常是指向List的實現,當你沒有具體的如何使用列表的時候,我不會說'LinkedList'幾乎總是一個壞主意。如果你不打算在列表中進行任何隨機訪問,並且將添加或刪除列表中的元素,例如'LinkedList'可能會更快。只需要知道每種類型的不同操作的相對成本以及您將要執行的操作。 – ColinD 2010-11-08 17:57:02
@Jeremy:有參考嗎?我很好奇。 – ColinD 2010-11-08 18:08:38
@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
有幾種選擇。一種方法是聲明一個代表一行的類。
public class MyRow{
private long rowId;
private int col1;
private int col2;
private int col3;
//etc
}
顯然你選擇適當的數據類型和變量名稱。
然後您可以創建這種類型的ArrayList:
List<MyRow> rows = new ArrayList<MyRow>();
這是,如果列數不會相差特別有用。
Spot on ........ – 2010-11-08 20:58:03
您可以使用Map<Integer, ArrayList<MyObject>>
,其中地圖的關鍵字是您的RowID。
製作ArrayList的ArrayList。例如:
ArrayList<ArrayList> arrayListOfLists = new ArrayList<ArrayList>();
arrayListOfLists.add(anotherArrayList);
//etc...
這是問題的唯一確切答案。 +1 – 2011-09-30 02:40:40
Java提供名單鑄造,因此,例如,你可以在下面的方式做到這一點:
ArrayList<List<someObject>> ArrayListOfLists = new ArrayList<List<someObject>>();
你嘗試過什麼?您是否閱讀過Java收集API(提示:Map,HashMap,List,ArrayList)。 – 2010-11-08 17:28:09