Как я могу отфильтровать данные дерева AVL - PullRequest
0 голосов
/ 09 ноября 2019

я получил окончательную домашнюю работу для своего класса. Дело в том, что нам нужен файловый менеджер, но с использованием деревьев. Я пытался сделать это, но я застрял в сортировке (потому что нам нужно отсортировать по размеру, имени, дате и т. Д.).

Я создал класс с именем File и я индексирую этот объект. Но я понял, что не могу отсортировать это дерево по критерию, который я хочу. Как я могу отсортировать по определенному фильтру только с помощью этого дерева (или, может быть, нет) и распечатать все данные (имя, размер, дата).

void BuscarArchivos() {
    string path;
    cout << "Ingrese la ruta: "; //type the path
    cin >> path;

    Archivo * arc2;
    string test;
    for (const auto & entry : fs::directory_iterator(path)) {
        test = entry.path().string();
        arc2 = new Archivo(test);
        tree->Insert(arc2); //indexing the file class 
    }
}
void ImprimirArchivo()...

Я хочу отсортировать дерево файлов по критерию.

1 Ответ

0 голосов
/ 09 ноября 2019

Для каждого критерия создайте дерево AVL в качестве индекса. Индексы используются только для ссылки на файловые объекты, которые хранятся в других ячейках памяти.

using Size = uint64_t;
using Name = std::string;
// using Data = whatever; 

struct Node {
    Size size; // file size
    Name name; // file name
    Data data; // whatever data
    explicit Node(const std::string &path) { /*omitted*/ }
    // construct from path
}

// Tree<Key, Data>
Tree<Size, std::shared_ptr<Node>> indexed_by_size_tree;
Tree<Name, std::shared_ptr<Node>> indexed_by_name_tree;
Tree<Data, std::shared_ptr<Node>> indexed_by_data_tree;

void Build() {
    std::string path;
    std::cin >> path;

    for (const auto &entry : fs::directory_iterator(path)) {
        auto node = std::make_shared<Node>(entry.path().string());
        indexed_by_size_tree.Insert(node->size, node); // size as key
        indexed_by_name_tree.Insert(node->name, node); // name as key
        indexed_by_data_tree.Insert(node->data, node); // data as key
    }
}

void TraverseOrderedBySize() {
    for (auto iter = indexed_by_size_tree.begin();
        iter != indexed_by_data_tree.end(); iter = std::next(iter)) {
        // deal with iter->key
    }
}
...