【问题标题】:What data structure to use?使用什么数据结构?
【发布时间】:2012-01-25 19:49:54
【问题描述】:

我需要表示以下数据(在 Java 中):

  • 2012(年)
    • 01(月)
      • 01(日)
        • 你好我是字符串
      • 02
      • ...
    • 02
    • 03
    • 04

我正在考虑使用 TreeMap,但不确定如何使用。有什么想法吗?

【问题讨论】:

  • 您对数据结构有什么要求,如查询时间(O(?))、内存空间等?
  • 我不确定这些要求。
  • 模型的对象是否以天为单位存储Strings?
  • 是的,所以我可以检索在某个日期输入的字符串。
  • 您也可以尝试通过实现邻接矩阵来使用图。虽然它更多地用于像 tomtom 的 GPS 设备中。维基百科为此提供了一些很好的提示。

标签: java data-structures map tree


【解决方案1】:

注意事项,假设您有兴趣管理日历条目

  • 有无限可能的日期 -- 不要在未使用的日子浪费内存
  • 给定一个日期,您希望快速访问它的日期 -- 使用 array 或基于哈希的查找
  • 每一天都有一个唯一的日期 -- map date => day

模型

// best to use ENUM for fixed set of constants
enum Month {
    JANUARY, FEBRUARY, ... , NOVEMBER, DECEMBER
}

enum Weekday {
    SUNDAY, MONDAY, ... , FRIDAY, SATURDAY
}

/**
 * The day "data node". Fill in constructors/accessors.
 */
class Day {
    int year;
    Month month;
    Weekday weekday;
    String date; // hashkey
    String entry; // the entry
}

/**
 * The calendar, simply mapping a unique date to it's day.
 * Create a date like: year + "-" + MONTH + "-" + DAY
 */
HashMap<String, Day> calendar;

观点
由于我们的数据结构不是稀疏的,因此独立视图必须模拟完整的日历。根据日历规则显示所有日期/生成所有日期,但如果保存了新条目,则仅在HashMap 中添加一天。

注意事项

  • 在空间和时间上非常高效。
  • 以上内容过于简单:将HashMap 包装在一个类中以仲裁days 上的CRUD 操作。
  • 假设您不需要处理月/年,而只需要处理几天。如果这是错误的,并且您想例如在month 中获取所有天数,或者删除year,考虑在上面添加一个类似于year =&gt; month =&gt; day 的三级地图。

【讨论】:

    【解决方案2】:

    来自 Swing 的 JTree 也可以用作数据结构。

    但您应该问自己的第一个问题是“我想如何访问数据”。

    【讨论】:

      【解决方案3】:

      你需要某种树状结构。这可能是您的起点:

      public class Node {
          private String label;
          private List<Node> children;
          //add Constructors, getters, setters, and member methods, etc
      }
      
      
      Node root = new Node();
      root.setLabel("2012");
      //children of root are "01", "02", etc.
      

      【讨论】:

        【解决方案4】:

        明确地将模型数据与视图数据分开。

        这是与佩斯利答案中提出的模型不同的模型。

        Map<Calendar, String> thisIsAllYouNeedForTheModel = new HashMap<Calendar, String>();
        Calendar thisIsTheKey = Calendar.getInstance();
        
        thisIsTheKey.clear();
        thisIsTheKey.set(Calendar.YEAR, theYear);
        thisIsTheKey.set(Calendar.MONTH, theMonth);
        thisIsTheKey.set(Calendar.DAY_OF_MONTH, theMonth);
        thisIsTheKey.set(Calendar.HOUR, theHour);
        thisIsTheKey.set(Calendar.MINUTE, theMinute);
        thisIsTheKey.set(Calendar.SECOND, theSecond);
        thisIsAllYouNeedForTheModel.put(thisIsTheKey, data);
        

        编辑:愚蠢的我。 Map&lt;Calendar, String&gt; 是我的建议。

        【讨论】:

        • Map&lt;String&gt; Map&lt;String,String&gt; 的简写吗?
        • 我的错。我刚刚输入了答案。 Map 是我的建议。
        【解决方案5】:

        我建议使用 TreeMap,但如果您想进行实验,请继续使用 LinkedList。如果您遍历许多列表,则访问数据非常复杂。但实验很有趣。

        编辑:这是一个教程,包括一个包,允许您使用 TreeMap 或类似于树的东西: http://code.google.com/p/qed-java/wiki/HowToUseTree

        【讨论】:

        • 我将如何实现树图?
        • 至少你不必实现它。它已经在那里实施。但是,如果您想自己动手,只需深入研究 TreeMap 结构的源代码并继续努力 :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多