应该使用哪个集合将xml文件存储在内存中?

时间:2013-09-21 19:48:35

标签: java data-structures collections

在我与Adobe的访谈中向我提出了这个问题。我回答可以使用hashmap,但他并不满意。

文件1

< tag1 >  
  < subtag1 >  
    < subsubtag1 >  
    </subsubtag1 >  
  < /subtag1 >  
< /tag1 >  
< tag2 >  
< /tag2 > 

n 需要将这些文件(即XML文件)的数量存储在内存中。编写java数据结构的实现,该结构应该用于将这些文件存储在内存中,以便有效地执行以下操作:

  1. 访问特定文件中的特定标记。
  2. 访问该标记所在的所有文件中的特定标记。
  3. 注意:

    1. 有数百万个文件需要存储
    2. 每个文件包含数百万个标签,每个标签可能包含数百万个子标签

3 个答案:

答案 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期间卸载
  • 或Google Guava的CacheBuilder具有良好且可调整的驱逐政策