2009-08-11 15 views
7

Próbuję podążać za przykładami podanymi w różnych miejscach dla aplikacji D. Generalnie, ucząc się języka, rozpoczynam od przykładowych aplikacji i sam je zmieniam, aby przetestować różne rzeczy.Sortowanie w oparciu o tablice asocjacyjne w D

Jedną z aplikacji, która wpadła mi w oko było policzenie częstotliwości słów w bloku przekazywanego tekstu. Ponieważ słownik został zbudowany w tablicy asocjacyjnej (z elementami przechowującymi częstotliwość, a klucze są samymi słowami), produkcja nie była w żadnej określonej kolejności. Tak więc spróbowałem posortować tablicę na podstawie przykładów podanych na stronie.

W każdym razie przykład pokazał lambdę 'sort! (...) (tablica);' ale kiedy spróbuję, kod dmd go nie skompiluje.

Oto sprowadzić Kod:

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]); 
    } 
} 

Kiedy próbuję skompilować ten kod, otrzymuję następujące

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

Czy ktoś może mi powiedzieć co muszę zrobić tutaj?

Używam DMD v2.031, próbowałem zainstalować gdc, ale to tylko wydaje się wspierać specyfikację języka v1. Zacząłem tylko patrzeć na dil, więc nie mogę komentować, czy to obsługuje powyższy kod.

+1

GDC niby martwy, LLVM oparty LDC podjęła ja miejsce t. – BCS

Odpowiedz

11

Spróbuj dodać ten u góry pliku:

import std.algorithm; 
+1

Doh! Dzięki, to działa. To zawsze proste rzeczy, na które najtrudniej jest znaleźć informacje! – GKelly

2

Oto jeszcze prostszy sposób, aby uzyskać plik wejściowy (z CMDLINE), uzyskać linie/słowa i wydrukować tabelę słowo frequencing, malejąco kolejność:

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]); 
} 

No, prawie 4 lata później ... :-)

Powiązane problemy