2016-07-30 98 views
0

我开始在java中投资项目,我需要一个好的数据结构来满足它的要求。我在这里看到了一些类似的问题,但有不同的要求。我应该使用哪种数据结构来处理多值数据?

我的要求如下:

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

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

首先,我想和符号创建地图的关键和公司名称作为值(为简单起见,假设我的收获从这里的数据: http://data.okfn.org/data/core/s-and-p-500-companies/r/constituents.csv),但后来我有一个第二个想法,因为符号和公司名称都是公司对象数据字段,所以也许这不是OO明智的最佳解决方案。另外,记住它也需要类似于查找功能的东西,以便公司不仅可以通过使用它们的符号而且可以找到它们的名称。

什么是最好的DS来满足我的要求? map<String Symbol, Company company>是否适合这种用途?

的几个注意事项:

假设我也想有都在我的计划,而不仅仅是寻找它在网络上的数据。

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

解决方案应该是这样搜索特定领域的所有公司(或其他数据 - 比如所有市值高于100 B $的公司),这些都很容易实施,并且效率很高。

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

数据也将被保存到一个文件。

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

+0

你确定你不想要持久性存储吗?如果仅使用内存存储,则当应用程序崩溃或关闭时,所有您的更改(如添加删除公司)都将丢失。 –

+0

是的,我忘了提及 – Niminim

+1

你确定你不想使用数据库吗? – Henry

回答

2

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

但是,在不太可能的情况下,有一种可以通过名称创建公司符号的决定性方式,反之亦然,可以创建一个散列函数来计算公司符号和名称的相同哈希值。在这种情况下,HashTable/HashMap将更加有效。


旁注:

既然你已经在你的数据保存到一个文件,这是一种持久性存储,我建议使用一个数据库。 DBMS的唯一目的是高效地存储,管理和查询大量数据,使其成为大多数情况下的最佳选择。使用Java的SQL库java.sql.*也很容易集成。

+0

我还没有找到更好的解决方案,可能创建两个地图是不可避免的。谢谢。你是对的,没有确定性的方法来知道公司名称的符号是什么,反之亦然,否则散列函数可以解决问题。 – Niminim

+0

也许在使用java类之后,我会使用java的sql库。 – Niminim

1

如果您在搜索时给出的符号或公司名称完全相同,则可以使用Map两次输入每家公司的名称。一旦用符号作为键,并用名称作为键一次。

1

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

相关问题