2011-11-27 58 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