【问题标题】:What is the choice of best data structure for this situation..?对于这种情况,最佳数据结构的选择是什么..?
【发布时间】:2011-01-09 16:32:05
【问题描述】:

看看我的 GUI 部分

一旦用户从分支 JComboBox 中选择了特定分支,我必须查询数据库并获取适用于该分支的所有年份,并将这些年份添加到下一个 JComboBox 年份等等。用户有相当多的机会在他选择的分支之间进行交换,我会发现自己每次更改选项时都会再次查询数据库相同的查询,并且数据库中的数据不太可能继续在这些交换之间进行更改....所以我决定将它们存储在某个数据结构中,对于这样的数据结构,我有什么最佳选择?可能有 2 到 3 个不同的分支,4 到 6 个不同的年份等等.....
我最好的选择是什么?

【问题讨论】:

  • 无关:应该是“学期”而不是“学期”
  • @Nishant 是的,对……:)
  • 这是一个类似 extJS 或 GWT 的 JavaScript GUI 吗?将您的数据库泄露给客户是个问题吗?数据库慢吗?你在使用 ORM 吗?你打算用一个吗?是否有任何复杂的业务逻辑需要在 Java 级别完成?验证呢?我很想回答 "none" 是最好的数据结构。数据库对此类信息的调用似乎不太可能很慢,如果数据“不太可能改变”,那么像 Hibernate 这样的 ORM 会非常温和地为您缓存所有这些。不管你有没有数据库,但在 Java 中复制它并不聪明。
  • @SpoonBender 是的,你是对的,但我的情况是我将我的数据库放在远程服务器中,并且网络速度非常慢......而且我应该为非常慢的机器构建这个应用程序运行奔腾 3 我猜...旧的大学计算机已经完全过时了,在这种情况下,我想将网络开销最小化到可行的最大量.....

标签: java data-structures collections


【解决方案1】:

如何创建一个地图,其中分支是关键,年份、学期和部分都在 VO 对象中?假设 VO 名为 BranchDetails,那么您可以使用类似 Map<String,BranchDetails>() 的名称。

BranchDetails 可以像下面这样简单:

class BranchDetails{
   List<Integer> years;
   List<Integer> semesters;
   List<Integer> sections;
   //getters and setters omitted for brevity 
}

【讨论】:

  • 这是 OP 想要的吗?按照我的理解,学期取决于年份,部分取决于学期。谁是对的?
  • @marcog- 在这种情况下,他需要将每个键嵌套映射到下一组可能的值。我不确定他在找哪一个。
  • 嵌套地图是我回答的。我们来看看 OP 怎么说。
  • & @marcog 学期取决于年份,而各个部分又取决于学期。看起来嵌套的 HashMap 就是我所需要的,但我不确定我将如何使用嵌套的 HashMap。请给我一些链接来解释我如何使用嵌套的 HashMaps.. 我实际上是 Collection Frameworks 的新手.....
【解决方案2】:

如果应用程序是单线程的,请使用HashMap。您可以“嵌套”HashMaps,例如HashMap&lt;String, HashMap&lt;Integer, HashMap&lt;Integer, HashMap&lt;String, Item&gt;&gt;&gt;&gt;。请参阅 this question 以了解如何迭代 HashMap

这里有一些示例代码,只使用了两个嵌套来给你一个想法:

HashMap<String, HashMap<Integer, HashMap<Integer, HashMap<String, String>>>> map1 = new HashMap<String, HashMap<Integer, HashMap<Integer, HashMap<String, String>>>>();
map1.put("Computers", new HashMap<Integer, HashMap<Integer, HashMap<String, String>>>());
map1.get("Computers").put(2011, new HashMap<Integer, HashMap<String, String>>());
map1.get("Computers").get(2011).put(2, new HashMap<String, String>());

【讨论】:

  • 应用程序是单线程的,但我如何将相同的分支名称映射到不同的年份,然后将这些年份映射到同一分支和年份的不同半学期?我完全不明白我将如何在这种情况下使用 HashMap?请帮忙..
  • @Sasidhar 你看到我在哪里嵌套了HashMaps的编辑了吗?你可以这样做。
  • @marcog 这正是我想要的,你能给我一些例子以便我更好地理解它,我不习惯使用集合框架和泛型类型......
  • @sasidhar 当然可以。先阅读this tutorial,如果有帮助,请告诉我。
  • @marcog 在您给出的代码中,我们将“开普敦分支”映射到 2011 年,然后映射到“项目”,但就我而言,我希望“开普敦分支”映射到多个元素,比如说 2011,2012,2013 ......而每年都映射到多个学期......比如说 1 和 2 或只到 1......我该怎么做......?我认为它更像一棵树.....
【解决方案3】:

我会将它们保存在包含完整数据的单独列表中。 (它们很小)。

List<Branch> branches;
List<Year> years;
List<Semester> semesters;
List<Section> sections;

每个对象Branch, Year, Semester, Section 都有必要的数据将它们链接到另一个对象。例如,Branch 可以包含list of yearId 等尽可能接近实际数据库结构的映射(以使初始加载快速简便)。

一旦您在 UI 中进行了状态更改,您只需复制此数据结构上的实际数据库查询并返回您需要的内容。

【讨论】:

  • 我不太了解我们如何实际实施您的想法,但无论如何 HashMap 看起来都足够有希望。
  • Map 方法有时会起作用,您应该这样做看看效果如何。不幸的是,我没有时间更详细地解释这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多