У меня есть список картинок, которые я хочу сгруппировать по годам, месяцам и дням.
После получения информации с диска я сначала сохраняю их в 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
, но, похоже, он может содержать только те же типы данных.
Как мне этого добиться? Или я должен подойти к этому совершенно по-другому? Спасибо!