Сортировка по ассоциативным массивам в D - PullRequest
7 голосов
/ 11 августа 2009

Я пытаюсь следовать примерам, приведенным в различных местах для приложений D. Обычно, когда я изучаю язык, я запускаю примеры приложений и изменяю их сам, просто для того, чтобы протестировать материал.

Одно приложение, которое привлекло мое внимание, заключалось в подсчете частоты слов в переданном блоке текста. Поскольку словарь был построен в ассоциативном массиве (с элементами, хранящими частоту, а ключами были сами слова) , вывод был не в каком-то определенном порядке. Итак, я попытался отсортировать массив на основе примеров, приведенных на сайте.

Во всяком случае, пример показал лямбду 'sort! (...) (array);' но когда я попробую код, dmd не скомпилирует его.

Вот код, приведенный ниже:

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

Когда я пытаюсь скомпилировать этот код, я получаю следующее

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

Может кто-нибудь сказать мне, что мне нужно делать здесь?

Я использую DMD v2.031, я пытался установить gdc, но кажется, что он поддерживает только языковую спецификацию v1. Я только начал смотреть на DIL, поэтому я не могу комментировать, поддерживает ли это код выше.

Ответы [ 2 ]

11 голосов
/ 11 августа 2009

Попробуйте добавить это в верхней части файла:

import std.algorithm;
2 голосов
/ 06 февраля 2013

Вот еще более простой способ получить входной файл (из cmdline), получить строки / слова и распечатать таблицу частотности слов в порядке убывания:

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

Ну, почти 4 года спустя ...: -)

...