none
retirar dados a partir de um arquivo, em forma de arvore RRS feed

  • Pergunta

  • Olá. Estou precisando retirar dados de um arquivo pré criado, onde eu mesmo armazeno os dados, em formato de arvore, onde cada elemento tem dois filhos, onde eu guardo 3 strings em cada elemento.

    Eu não tenho a minima ideia de como fazer isso, e eu sou um programador amador (não sou estudante).




    • Editado Rodrigo077 quarta-feira, 16 de novembro de 2016 20:51
    terça-feira, 15 de novembro de 2016 23:23

Respostas

  • Acho que consegui sem utilizar uma estrutura de arvores, apenas organizando as linha e fazendo um metodo para encontrar a linha de tal coordenada. A coordenado que uso é binária, tipo 0101101, então eu converto para decimal, de maneira invertida, onde o primeiro digito vale o valor máximo (em vez de fazer 0*1 + 1*2+ 0*4 ..., eu faço 0*32 + 1*16 ...) e localizo a linha por esse número(para isso eu tenho eu multiplicar por 2 e somar o número de zeros no número, para obter o número da linha - 1). Só preciso criar uma maneira de fazer essa conversão, e depois ler a linha no arquivo (que aprendi a fazer). As linhas estariam organizadas como no exemplo da em uma resposta minha acima.

    Acho que não precisava montar realmente uma arvore de dados.

    Agradeço pelo ajuda.


    quinta-feira, 17 de novembro de 2016 21:59

Todas as Respostas

  • O nome do seu usuário está igual ao post, seria bom corrigir o seu perfil.

    Quanto ao seu problema, precisa ser carregado de um arquivo (imagino que seja um arquivo TXT) e nele você tem o que? Cada linha tem 3 palavras? Não, cada linha tem um texto que vai ser indexado na sua árvore?

    Tranquilo, leia o arquivo de texto, com "FileStream" e "StreamReader", através do método "ReadLine". Aqui tem um exemplo: MSDN.

    Então vem a parte da árvore. Você vai precisar de uma classe para isso, acredito eu que algo assim:

    public class Node
    {
        public string Value { get; set; }
        public Node NextNode { get; set; }
        public Node PrevNode { get; set; }
    }

    Ai você cria uma instância da classe, com o valor de primeira linha. Ao ler a próxima linha compare se o valor do Nó (dai o nome "node") é maior/menor e crie um novo "Node", colocando ele no "PrevNode" se menor ou no "NextNode" se maior.

    Comparar maior e menor vai depender de você; considerando que é uma string e não um número, o que você vai considerar "maior" e "menor"? A ordem alfabética? O comprimento?

    • Marcado como Resposta Rodrigo077 quarta-feira, 16 de novembro de 2016 19:43
    • Não Marcado como Resposta Rodrigo077 quarta-feira, 16 de novembro de 2016 19:43
    quarta-feira, 16 de novembro de 2016 10:31
  •  Não preciso criar a arvore no código, apenas ler.

    No caso eu tenho armazenado no arquivo algo quase desse modo (aceito variações):

    "Texto principal"; "opcaoA"; "opcaoB";
        "Texto principalA"; "opcaoAA"; "opcaoAB";
            "Texto principalAA"; "opcaoAAA"; "opcaoAAB";
                ...
            "Texto principalAB"; "opcaoABA"; "opcaoABB";
                ...
        "Texto principalB"; "opcaoBA"; "opcaoBB";
            "Texto principalBA"; "opcaoBAA"; "opcaoBAB";
                ...
            "Texto principalBB"; "opcaoBBA"; "opcaBBB";
                ...

    Mas no caso eu não sei como localizar um dado específico nessa "arvore binária", e também como ler cada node com as 3 variáveis. Talvez eu possa localizado pela linha, através de organização, mas não sei ler um linha específica com o StreamReader.

    Também não intendi a respeito do próximo ou anterior ser maior ou menor. Acho que expressei mal a dizer arvore binária.

    quarta-feira, 16 de novembro de 2016 19:42
  • O que você precisa fazer com os dados do arquivo após leitura do mesmo? Assim evitamos de complicar desnecessariamente na resposta.

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 17 de novembro de 2016 01:21
  • Bom Rodrigo, vamos lá.

    A sua "árvore" NÃO é uma árvore no arquivo. Para o dado virar de fato uma árvore B+ ele precisa estar estruturado. Você não vai conseguir abrir uma linha de dados específica em um arquivo texto visto que a leitura de arquivos texto deve ser feita linha a linha.

    Se você não quiser carregar a árvore inteira na memória (em classes como a que escrevi) para busca, a solução seria usar um arquivo binário. Teria que fazer algo um pouco mais complicado para escrevê-lo, mas basicamente seria valor (em string), e 2 long (tudo em binário), um com o endereço, NO ARQUIVO, do primeiro byte do valor anterior e do próximo. Ai sim você pode ler 1 registro, fazer a comparação (B+/B-) e pular para o endereço apontado, repetindo esse processo até que chegue no registro desejado.

    Sendo arquivo "texto", mesmo que você escreva o B+/B-, não tem como saber, NO ARQUIVO aonde eles estão posicionados. A estrutura que você fez pode ser interpretada (quase) por um JSON ou um XML, mas o que essas bibliotecas fazem é sempre carregar o arquivo inteiro em um documento.

    quinta-feira, 17 de novembro de 2016 16:09
  • Acho que consegui sem utilizar uma estrutura de arvores, apenas organizando as linha e fazendo um metodo para encontrar a linha de tal coordenada. A coordenado que uso é binária, tipo 0101101, então eu converto para decimal, de maneira invertida, onde o primeiro digito vale o valor máximo (em vez de fazer 0*1 + 1*2+ 0*4 ..., eu faço 0*32 + 1*16 ...) e localizo a linha por esse número(para isso eu tenho eu multiplicar por 2 e somar o número de zeros no número, para obter o número da linha - 1). Só preciso criar uma maneira de fazer essa conversão, e depois ler a linha no arquivo (que aprendi a fazer). As linhas estariam organizadas como no exemplo da em uma resposta minha acima.

    Acho que não precisava montar realmente uma arvore de dados.

    Agradeço pelo ajuda.


    quinta-feira, 17 de novembro de 2016 21:59