更好的数据结构,可以更快地读取列表地图的地图

时间:2011-11-27 13:50:39

标签: java performance data-structures collections

我有一个场景,我需要在内存中存储数据层次的列表的地图的地图。而且,目前我正在考虑将数据结构实现为

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

和混凝土类型是,

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

由于我不需要维护任何特定的顺序,我也在考虑将List替换为SetHashSet),这可能会提高性能。

虽然我已经尝试过,但我也认为使用谷歌'番石榴Multimap是一个可行的替代品,但我不确定。

背景 我需要存储每个学生的详细信息 id &amp;他们感兴趣的书名按其主题类型分类的信息,这些信息将由库名称进一步组织。我需要处理数据和显示书名主要由学生ID和其他时间按图书馆名称和主题类型。一旦向用户显示了图书名称,我就需要从图书名称列表中删除该条目。

数据结构需要保持&amp;以高比率处理数千个条目,并将数据保存更长时间。

请建议一种方法或其他数据结构以加快处理速度,并建议数据结构/集合类的类型及其使用组合。

(请注意,我上面描述的场景不是确切的情况,但我尽力抽象出数据层次结构的复杂性)

1 个答案:

答案 0 :(得分:3)

我认为你在这里遗漏了很多抽象。经验法则是:每次集合持有另一个集合时,应引入中间对象

在您的情况下,这是我建议的OO设计:

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)