Какую структуру данных использовать? - PullRequest
4 голосов
/ 25 января 2012

Мне нужно представить следующие данные (на Java):

  • 2012 (год)
    • 01 (за месяц)
      • 01 (день)
        • Здравствуйте, я строка
      • 02
      • ...
    • 02
    • 03
    • 04
    • ...

Я думал об использовании TreeMap, но не уверен, как. Есть идеи?

Ответы [ 5 ]

1 голос
/ 26 января 2012

Соображения, если вы заинтересованы в управлении записями календаря :

  • Возможны бесконечные даты - не тратьте память на неиспользованные дни
  • Учитывая дату, вы хотите быстро получить доступ к ее дню - использовать массив или поиск на основе хеша
  • Каждый день имеет уникальную дату - дата карты => день

МОДЕЛЬ

// 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 в класс для арбитража CRUD операций над days.
  • Предполагается, что вам не нужно манипулировать месяцами / годами, а только днями. Если это не так, и вы хотели бы, например, получите все дни в month или удалите year, подумайте о том, чтобы иметь трехуровневую карту, например year => month => day рядом с ней.
0 голосов
/ 26 января 2012

Определенно отделяйте данные модели от данных вида.

Здесь модель, отличная от предложенной в пейсли-ответе.

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<Calendar, String> мое предложение.

0 голосов
/ 25 января 2012

Вам понадобится какая-то древовидная структура.Это может быть вашей отправной точкой:

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.
0 голосов
/ 25 января 2012

Я бы предложил TreeMap, но если вы хотите провести эксперименты, просто используйте LinkedList.Обработка данных довольно сложна, если вы перебираете множество списков.Но было очень весело экспериментировать.

РЕДАКТИРОВАТЬ: Вот учебник, включающий пакет, который позволяет использовать TreeMap или что-то похожее на дерево: http://code.google.com/p/qed-java/wiki/HowToUseTree

0 голосов
/ 25 января 2012

JTree от Swing также может использоваться как структура данных.

Но первый вопрос, который вы должны себе задать, это «Как я хочу получить доступ к данным».

...