用于存储数千个带有唯一索引的对象的数据结构

3
我正在用Java SAX解析器读取一个巨大的xml文件: http://api.steampowered.com/IEconItems_440/GetSchema/v0001/?format=xml (2.82 MB)
这个文件包含数千个'items',每个'item'都有诸如'name'、'level'等属性。其中之一是称为'defindex'的唯一整数标识符。我为每个'item'创建了POJO,将其中一些已提及的属性作为字段(defindex是其中之一)。
我的需求是:
  • 我需要通过搜索defindex来经常读取这些item对象
  • 但我不会更改对象的数据字段
我的问题是:我应该如何存储这些item对象? 我的第一个想法是将它们存储在数组中,并使用defindex作为实际的数组索引,但数组会很大,并且并非所有的defindexes都被使用,例如它在某一点上从2k跳到30k。

4
地图有什么问题? - Dave Newton
你可以使用单用户数据库,例如h2hsql来存储数据,然后可以使用标准SQL提取数据。这些数据库是可配置的,可以在内存或磁盘上运行。 - MadProgrammer
1
@morgano 28000个nulls。 - Dave Newton
1个回答

5
使用 MapMap 对象存储唯一“键”和值之间的关系。
实现Map 的有 HashMapTreeMap,还有其他的。它们是通用的,具有用于键和值的类型参数。
您可以使用以下内容。这绝对是伪代码;根据您将要操作这些对象的方式进行调整。我没有考虑 SAX API;这只是演示如何使用一个 Map
Map<Integer, Item> items = new HashMap<Integer, Item>();
for (Item itemToRead : file) { // or however you iterate
    items.put(item.getDefindex(), item);
}

// data retrieval
Item itemToRetrieve = items.get(defindexToGet);

你列举了几个Map的实现,如HashMap和TreeMap。是否有一种特定的Map实现特别适合这种问题? - ChopChop
2
如果你的代码不是多线程的,我建议使用HashMap。如果需要某种自动排序功能,则使用TreeMap;它会自动对放入其中的所有键进行排序,并且可以获取最大和最小键。(LinkedHashMap允许按照放置在映射中的顺序迭代数据。)如果你的代码是多线程的,可以尝试使用ConcurrentHashMap(java.util.concurrent包),但我对多线程不是很熟悉。一般来说,选择以“Map”结尾的一个;据我所知,其他的倾向于更加专业化。 - ameed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接