2009-08-11 8 views
7

J'essaie de suivre des exemples donnés à divers endroits pour les applications D. Généralement, lorsque j'apprends une langue, je commence par des exemples d'applications et je les change moi-même, uniquement pour tester des choses. Une application qui a attiré mon attention était de compter la fréquence des mots dans un bloc de texte transmis. Comme le dictionnaire a été construit dans un tableau associatif (avec les éléments stockant la fréquence, et les clés étant les mots eux-mêmes), la sortie n'était pas dans un ordre particulier. Donc, j'ai essayé de trier le tableau en fonction des exemples donnés sur le site. Quoi qu'il en soit, l'exemple montre un lambda 'sort! (...) (array);' mais quand je tente le code dmd ne le compilera pas.Tri basé sur des tableaux associatifs en D

Voici le code bouilli vers le bas:

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

Lorsque je tente de compiler ce code, je reçois le texte suivant

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

Quelqu'un peut-il me dire ce que je dois faire ici? J'utilise DMD v2.031, j'ai essayé d'installer le gdc mais cela ne semble prendre en charge que la spécification du langage v1. J'ai seulement commencé à regarder dil, donc je ne peux pas commenter si cela supporte le code ci-dessus.

+1

GDC est une sorte de mort, les PMA en fonction LLVM a pris i La place de t. – BCS

Répondre

11

Essayez d'ajouter ce en haut du fichier:

import std.algorithm; 
+1

Doh! Merci, ça fonctionne. C'est toujours le truc le plus simple à trouver! – GKelly

2

est ici une façon encore plus simple pour obtenir un fichier d'entrée (à partir cmdline), obtenir des lignes/mots et imprimer une table de mots frequencing, en descendant ordre:

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

Eh bien, presque 4 ans plus tard ... :-)

Questions connexes