【问题标题】:Data Structure for storing several thousand objects with unique index用于存储具有唯一索引的数千个对象的数据结构
【发布时间】:2013-07-24 02:00:35
【问题描述】:

我正在使用 Java SAX 解析器读取一个巨大的 xml 文件: http://api.steampowered.com/IEconItems_440/GetSchema/v0001/?format=xml (2.82 MB)

此文件包含数千个“项目”,每个项目都具有“名称”、“级别”等属性。其中一个属性是称为“defindex”的唯一整数标识符。我正在为这些项目中的每一个创建 POJO,并将上面提到的一些属性作为字段(defindex 就是其中之一)。

  • 我需要通过搜索 defindex 来大量阅读这些项目对象
  • 我不会更改对象的数据字段

我的问题是:我应该如何存储这些项目对象?

我的第一个想法是将它们存储在一个数组中,并使用 defindex 作为实际的数组索引,但数组会很大,并且并非所有的 defindexes 都被使用,例如它在某一时刻从 2k 跃升至 30k。

【问题讨论】:

  • 地图有什么问题?
  • 您可以使用h2hsql 等单用户数据库来存储数据,然后您可以使用标准SQL 提取数据。这些是可配置的,以便它们可以在内存或磁盘中运行
  • @morgano 28000 空值。

标签: java data-structures


【解决方案1】:

使用Map

Map 对象存储唯一“键”和值之间的关系。

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 的具体实现?
  • 如果您的代码不是多线程的,我只会使用 HashMap。如果您需要某种形式的自动排序,请使用 TreeMap;它会自动对您放入其中的所有键进行排序,您可以获得最大和最小键。 (LinkedHashMap 让您可以按照数据在地图中的放置顺序遍历数据。)如果您的代码是多线程的,您可以尝试使用 ConcurrentHashMap(包 java.util.concurrent),但我并不精通多线程。一般来说,选择一个名字以Map结尾的;据我所知,其他人往往更专业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2016-11-25
  • 2022-01-02
相关资源
最近更新 更多