2009-08-11 12 views
7

Estoy intentando seguir los ejemplos que se dan en varios lugares para las aplicaciones D. En general, cuando estoy aprendiendo un idioma, empiezo con aplicaciones de ejemplo y las cambio por mi cuenta, solo para probar cosas.Ordenamiento basado en matrices asociativas en D

Una aplicación que me llamó la atención fue contar la frecuencia de palabras en un bloque de texto pasado. Como el diccionario se construyó en una matriz asociativa (con los elementos que almacenan la frecuencia, y las teclas son las palabras mismas), la salida no estaba en un orden particular. Por lo tanto, intenté ordenar la matriz en función de los ejemplos que figuran en el sitio.

De todos modos, el ejemplo mostraba un tipo 'lambda' (...) (array); ' pero cuando intento el código, dmd no lo compilará.

Aquí está el reducía código:

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

Cuando intento compilar el código, me sale el siguiente

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

Puede alguien decirme lo que tengo que hacer aquí?

Uso DMD v2.031, he intentado instalar el gdc pero esto solo parece ser compatible con la especificación del lenguaje v1. Solo comencé a buscar dil, así que no puedo comentar si esto respalda el código anterior.

+1

GDC es una especie de muerto, el PMA basada LLVM ha tomado i lugar de t. – BCS

Respuesta

11

Trate de añadir esta cerca de la parte superior del archivo:

import std.algorithm; 
+1

Doh! Gracias, eso funciona. ¡Siempre es lo más simple en lo que es más difícil encontrar información! – GKelly

2

Aquí está una manera aún más simple para obtener un archivo de entrada (de cmdline), obtener líneas/palabras e imprimir una tabla de frequencing palabra, de mayor a menor orden:

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

Bueno, casi 4 años después ... :-)

Cuestiones relacionadas