Изменяемая структура данных, подобная древовидной структуре (группа по годам, месяцам и дням) - PullRequest
0 голосов
/ 13 января 2020

У меня есть список картинок, которые я хочу сгруппировать по годам, месяцам и дням.

После получения информации с диска я сначала сохраняю их в Ve c со следующей структурой данных :

#[derive(Debug)]
struct PictureInformation {
    title: String,
    date: chrono::NaiveDate
}

Теперь я хочу создать дерево со следующей структурой: Ve c лет, каждый год может содержать месяцы, и каждый месяц может содержать дни, и каждый день имеет несколько PictureInformation.

#[derive(Debug)]
struct Year {
    year: i32,
}

#[derive(Debug)]
struct Month {
    year: i32,
    month: u8
}

Мой способ их группировки в настоящее время относительно прост:

  • Для каждой PictureInformation в Ve c:
    • Извлечение года
    • Год уже присутствует в структуре сгруппированных данных?
    • , если нет, создайте новый Year и добавьте его в структуру данных и продолжайте с этим
    • , если да, используйте возвращаемую из структуры данных.
    • Продолжить то же самое для месяца и дня.

Мой первый подход - использование Ve c с включенным Box<Year> потому что Ve c может изменить свою позицию во время изменения размера и ссылка, которую я должен был бы на год, больше не действительна. Поэтому я подумал о том, чтобы держать ссылку на Year внутри коробки. К сожалению, у меня есть проблемы с средством проверки заимствования, то есть я не могу получить ссылку на Year, потому что данные принадлежат вектору после того, как я переместил его туда.

Мой второй подход - использование HashSet, но содержимое HashSet не является изменяемым. Я реализовал Hash только для атрибута year, но я не смог получить изменяемый Year из Hashset (хотя мне действительно понравился get_or_insert()).

Мой третий подход заключался в вставьте RefCell в HashSet, но он не реализует Hash.

Тогда я попробовал indextree::Arena, но, похоже, он может содержать только те же типы данных.

Как мне этого добиться? Или я должен подойти к этому совершенно по-другому? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...