在我与Adobe的访谈中向我提出了这个问题。我回答可以使用hashmap,但他并不满意。
< tag1 >
< subtag1 >
< subsubtag1 >
</subsubtag1 >
< /subtag1 >
< /tag1 >
< tag2 >
< /tag2 >
n 需要将这些文件(即XML文件)的数量存储在内存中。编写java数据结构的实现,该结构应该用于将这些文件存储在内存中,以便有效地执行以下操作:
注意:
答案 0 :(得分:0)
我想到TreeSet
。
访问和检索时间非常快,这使得TreeSet成为存储必须快速找到的大量已排序信息的绝佳选择。
类似的东西:
public class Storage{
private String mTagName;
private String mAttribute;
private TreeSet<Storage> mTree;
}
包含自身TreeSet
的类。适合递归。
答案 1 :(得分:0)
我不认为使用HashMap是问题(在底部解释)。假设您的XML不包含任何属性,而不是HashMap<String, Element>
(TreeMap也可以),其中String是XML标记,
class Element {
Set<Files /* or something that represents them */> filesContainingTag;
Map<String, Element> subTags;
}
这样你知道哪些文件包含“tag path”并且可以获得单个文件。
要访问给定文件中的标记,只需按标记浏览此结构,然后检查此文件是否在filesContainingTag
中。如果您以某种方式识别这些文件(例如通过路径),请使用Map而不是set。
为什么使用Hash *而不是Tree *结构?因为如上所述 - 当你需要在迭代中排序时,Tree *很好。在大多数其他情况下,Hash *更快更容易使用(实现散列函数比比较器更容易)。你不想使用Hash *的唯一情况是当你期望恶意输入时 - 当有人知道你正在使用什么散列函数并且会提供充满碰撞的数据时。
答案 2 :(得分:0)
问题可能在于问题的注释,这需要访问大型数据集。它肯定不会完全适合内存,但如果你卸载未使用的数据可能部分适合。所以我会选择
WeakHashMap
在您的应用中不再使用某个项目时在GC期间卸载