2011-11-27 59 views
0

我有一個場景,我需要存儲數據層次列表地圖的地圖在內存中處理。而且,目前我米思維來實現數據結構更好的數據結構,以更快地讀取列表地圖的地圖

Map<Integer, Map<String, Map<Integer, List<String> > > > 

和混凝土類型,

HashMap<stdIdInt, HashMap<libraryNameStr, HashMap<topicIdInt, ArrayList<bookNameStr> > > > 

正如我不需要維護任何特定的順序,我M還想着更換ListSetHashSet)可能會提高性能。

儘管我已經嘗試到現在,我也認爲使用谷歌的'番石榴Multimap是一個可行的替代,但我不知道。

背景:我需要存儲的每個學生ID &他們的興趣書名信息通過其主題類型將由庫名稱來進一步組織分類的細節。我需要根據庫名&主題類型來處理數據&顯示圖書名稱大多由學生ID和其他時間。一旦書名向用戶顯示,我需要從書名列表中刪除該條目。

數據結構需要保持&以高速率處理數千個條目並且將保存數據較長時間。

請建議一種方法或其他數據結構以加快處理速度,並且請提供關於數據結構/集合類的類型及其使用組合的信息

(請注意我上面描述的場景是不準確的情況,但我想我最好的抽象的數據層次結構的複雜性)

+1

「高速率」和「長時間」是什麼意思?對我來說,這一切聽起來都像一個數據庫。 – skaffman

+0

@skaffman在高峯時間,請求將達到〜1000+ /秒,並且數據將保留一天左右,之後將在第二天發佈新數據。是的,我試圖在DB上做的東西,因爲每次碰到數據庫時都知道所有的數據只是用於處理,而不是永久存儲。 – manikanta

+0

這聽起來像是不成熟的優化。我會採取@ Tomasz的建議來改進抽象,然後確定數據結構是否能夠充分執行某些基準測試。如果沒有,請確定太慢的部分並改進。 –

回答

3

我認爲你是在這裏失去了很多抽象的。經驗法則是:每次集合擁有另一個集合時,應該引入中間對象

你的情況,這是我的建議的面向對象的設計:

class Student { 
    private int id; 
    private Map<Integer, Library> libraries; 
    private getLibrary(int id) {return libraries.get(id);} 
} 

class Library { 
    private int id; 
    private Map<Integer, Topic> topics; 
    private getTopic(int id) {return topics.get(id);} 
} 

class Topic { 
    private int id; 
    private Map<Integer, Book> books; 
    private getBook(int id) {return books.get(id);} 
} 

class Book { 
    private int id; 
    private String name; 
} 

與用法:

Map<Integer, Student> students = //... 
students.get(6).getLibrary(5).getTopic(4).getBook(3) 

當然這個代碼需要大量的進一步改進。例如。一行中不需要多於一個.。但它已經比以下更具可讀性:

students.get(6).get(5).get(4).get(3) 
+0

我完全同意你的觀點,我已經把它的複雜性抽象出來了。我有類似的OO設計。但我的疑問是關於數據結構/集合類的類型及其使用組合 – manikanta

+0

我想'主題'需要具有'列表'或'列表'用於書名 – manikanta

+0

我最終使用了具有類似VO的列表,我發現我需要一遍又一遍遍歷列表。 – manikanta