我有一个场景,我需要在内存中存储数据层次的列表的地图的地图。而且,目前我正在考虑将数据结构实现为
Map<Integer, Map<String, Map<Integer, List<String> > > >
和混凝土类型是,
HashMap<stdIdInt, HashMap<libraryNameStr, HashMap<topicIdInt, ArrayList<bookNameStr> > > >
由于我不需要维护任何特定的顺序,我也在考虑将List
替换为Set
(HashSet
),这可能会提高性能。
虽然我已经尝试过,但我也认为使用谷歌'番石榴Multimap是一个可行的替代品,但我不确定。
背景 我需要存储每个学生的详细信息的 id &amp;他们感兴趣的书名按其主题类型分类的信息,这些信息将由库名称进一步组织。我需要处理数据和显示书名主要由学生ID和其他时间按图书馆名称和主题类型。一旦向用户显示了图书名称,我就需要从图书名称列表中删除该条目。
数据结构需要保持&amp;以高比率处理数千个条目,并将数据保存更长时间。
请建议一种方法或其他数据结构以加快处理速度,并建议数据结构/集合类的类型及其使用组合。
(请注意,我上面描述的场景不是确切的情况,但我尽力抽象出数据层次结构的复杂性)
答案 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)