Pergunta

Eu estou tentando seguir exemplos dados em vários lugares para aplicativos d. Geralmente, quando a aprendizagem de uma língua que eu começar no exemplo aplicativos e alterá-las eu mesmo, apenas para material de teste para fora.

Um aplicativo que chamou a atenção foi para contar a freqüência de palavras em um bloco de texto passado. Como o dicionário foi construído em uma matriz associativa (com os elementos que armazenam a frequência, e que as teclas sejam as próprias palavras) , a saída não estava em qualquer ordem particular. Então, eu tentei classificar a matriz baseada em exemplos dados no site.

De qualquer forma, o exemplo mostrou uma lambda 'sort (...) (array);!' mas quando eu tentar o código DMD não compilá-lo.

Aqui está o código resumia:

import std.stdio;
import std.string;

void main() {
   uint[string] freqs;

   freqs["the"] = 51;
   freqs["programming"] = 3;
   freqs["hello"] = 10;
   freqs["world"] = 10;

   /*...You get the point...*/

   //This is the actual example given, but it doesn't 
   //seem to work, old D version???
   //string[] words = array(freqs.keys);        

   //This seemed to work
   string[] words = freqs.keys;

   //Example given for how to sort the 'words' array based on 
   //external criteria (i.e. the frequency of the words from 
   //another array). This is the line where the compilor craps out!
   sort!((a,b) {return freqs[a] < freqs[b];})(words);

   //Should output in frequency order now!
   foreach(word; words) {
      writefln("%s -> %s", word, freqs[word]);
   }
}  

Quando tento compilar este código, eu recebo a seguinte

    s1.d(24): Error: undefined identifier sort
    s1.d(24): Error: function expected before (), not sort of type int

Alguém pode me dizer o que eu preciso fazer aqui?

Eu uso DMD v2.031, eu tentei instalar o GDC, mas isso só parece apoiar a especificação linguagem v1. Eu só comecei a olhar para dil, então eu não posso comentar sobre se este suporta o código acima.

Foi útil?

Solução

Tente adicionar este perto do topo do arquivo:

import std.algorithm;

Outras dicas

Aqui está uma maneira ainda mais simples para obter um arquivo de entrada (a partir de cmdline), obter linhas / palavras e imprimir uma tabela de palavra frequencing, em ordem decrescente:

import std.algorithm;
import std.file;
import std.stdio;
import std.string;

void main(string[] args)
{   
    auto contents = cast(string)read(args[1]);
    uint[string] freqs;

    foreach(i,line; splitLines(contents))
        foreach(word; split(strip(line)))
            ++freqs[word];

    string[] words = freqs.keys;
    sort!((a,b)=> freqs[a]>freqs[b])(words);

    foreach(s;words) 
        writefln("%s\t\t%s",s,freqs[s]);
}

Bem, quase 4 anos depois ...: -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top