我应该使用哪种数据结构来处理多值数据?

时间:2016-07-30 09:10:25

标签: java data-structures

我开始研究java中的投资项目,我需要一个良好的数据结构来满足其要求。我在这里看到了一些类似问题的解决方案,但有不同的要求。

我的要求如下:

  1. 公司对象有一个符号,公司名称,部门和财务数据字段。

  2. 搜索特定公司需要使用符号或公司名称。

  3. 首先,我考虑创建一个以符号作为键和公司名称作为值的地图(为简单起见,假设我从这里收集数据: http://data.okfn.org/data/core/s-and-p-500-companies/r/constituents.csv),但后来又考虑了因为符号和公司名称都是公司对象数据字段,所以也许它不是OO方面的最佳解决方案。另外,请记住它还需要类似vlookup功能的东西,因此公司不仅可以使用它们的符号而且还可以找到它们的名称。

    满足我要求的最佳DS是什么? map<String Symbol, Company company>对此有用吗?

    一些注意事项:

    假设我还希望在程序中包含所有数据,而不仅仅是在网络上搜索它。

    此DS中有500个对象,但可以添加或删除公司。

    解决方案应该是搜索特定行业的所有公司(或其他数据 - 如市值超过100 B $的所有公司等)将易于实施和高效。

    我不知道用户是否输入了符号或公司名称。

    数据也将保存到文件中。

    解决方案应该只使用java核心(不是commons,guava等)。

3 个答案:

答案 0 :(得分:2)

如果您真的只想使用Java类,那么使用两个Maps是最佳选择。虽然它确实需要两个操作来存储单个新公司,但您可能会比存储数据更频繁地读取数据。只要它作为参考存储,第二张地图所需的额外空间可以忽略不计。

然而,在不太可能的情况下,有一种确定的方法来创建公司的名称,反之亦然,可以创建一个哈希函数来计算相同的哈希值公司的象征和名称。在这种情况下,HashTable / HashMap的效率会更高。

<强>旁注:

由于您已将数据保存到文件(这是一种持久存储),因此我建议您使用数据库。 DBMS的唯一目的是有效地存储,管理和查询大量数据,使其成为大多数情况下的最佳选择。使用Java的SQL库java.sql.*,它也很容易集成。

答案 1 :(得分:1)

如果您在搜索时准确指定了符号或公司名称,则可以使用Map两次输入每个公司。一次使用符号作为键,一次使用名称作为键。

答案 2 :(得分:1)

如果你可以使用数据库,那就容易多了。无需创建映射来将所有Company对象保存在内存中。将所有Company对象作为行保留到数据库中,可以将symbol作为主键。这使得用符号直接搜索。然后,您可以为数据库表索引公司名称列,这将使公司名称也直接查询。但是,插入操作需要更多的空间和时间,读取操作会更快。同样,您可以为其他字段/列创建索引,例如市值,根据这些字段/列通常会查询公司。不是根据不同的字段编写逻辑来查询公司对象,而是将这项工作留给数据库,只需查询数据库中的内容即可。