Classificação com base em matrizes de associação em D
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.
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 ...: -)