2009-08-11 14 views
7

私はDアプリのさまざまな場所にある例を辿ろうとしています。一般的に言葉を学ぶとき、私はサンプルのアプリケーションから始まり、自分自身を変更して純粋にテストします。連想配列によるソートD

私の目を引く1つのアプリは、渡されたテキストのブロック内の単語の頻度を数えることでした。辞書が連想配列(頻度を格納する要素とキーが単語そのものです)、出力は特定の順序ではなかった。だから、私はサイト上で与えられた例に基づいて配列をソートしようとしました。

とにかく、この例ではラムダソート(...)(配列);私はコードをdmdしようとするとコンパイルされません。

はここで煮詰めコードです:私はこのコードをコンパイルしようとすると、私は次のよう

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

を取得

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

誰も私がここで何をする必要があるかを教えてもらえますか?

私はDMD v2.031を使用していますが、gdcをインストールしようとしましたが、v1言語仕様しかサポートしていないようです。私はdilを調べ始めたばかりなので、これが上記のコードをサポートしているかどうかはコメントできません。ファイルの先頭付近にこれを追加すること

+1

GDCが死んだの一種で、LLVMベースのLDCは、私をとっていますtの場所。 – BCS

答えて

11

試してみてください。

import std.algorithm; 
+1

Doh!ありがとう、それは動作します。情報を見つけるのが最も簡単なのは、常に簡単なものです! – GKelly

2

ここで降順に、(コマンドラインパラメータからの)入力ファイルを取得する行/単語を取得し、単語frequencingの表を印刷するにも簡単な方法ですオーダー:

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年後... :-)