基于D中的关联数组进行排序

时间:2009-08-11 10:04:02

标签: d dmd

我正在尝试按照D应用在各个地方给出的示例。通常在学习语言时,我会从示例应用程序开始并自行更改,纯粹是为了测试内容。

引起我注意的一个应用是计算传入的文本块中的单词的频率。因为字典是在关联数组中构建的(元素存储频率,键是单词本身) ,输出没有任何特定的顺序。因此,我尝试根据网站上给出的示例对数组进行排序。

无论如何,这个例子显示了一个lambda'排序!(...)(数组);'但是当我尝试代码时,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 个答案:

答案 0 :(得分:11)

尝试在文件顶部附近添加:

import std.algorithm;

答案 1 :(得分:2)

这是一种更简单的方法来获取输入文件(来自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年后......: - )