7

我正在尝试遵循 D 应用程序在各个地方给出的示例。通常在学习一门语言时,我会从示例应用程序开始并自己更改它们,纯粹是为了测试东西。

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

无论如何,该示例显示了一个 lambda '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):错误:未定义的标识符排序
    s1.d(24):错误:函数在 () 之前,不是 int 类型

谁能告诉我我需要在这里做什么?

我使用 DMD v2.031,我尝试安装 gdc 但这似乎只支持 v1 语言规范。我才开始看dil,所以我不能评论它是否支持上面的代码。

4

2 回答 2

11

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

import std.algorithm;
于 2009-08-11T10:38:47.517 回答
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 年后... :-)

于 2013-02-06T13:02:31.057 回答