Domanda

Sto cercando di seguire esempi forniti in diversi luoghi per le applicazioni tridimensionali. In genere quando si impara una lingua mi metto su esempi di applicazioni e cambiare io stesso, puramente a prova di roba.

Un'applicazione che ha attirato la mia attenzione è stato quello di contare la frequenza delle parole in un blocco di testo passato in. Mentre il dizionario è stato costruito in un array associativo (con gli elementi di memorizzazione della frequenza, e le chiavi di essere le parole stesse) , l'uscita non è in alcun ordine particolare. Così, ho cercato di ordinare l'array in base a esempi forniti sul sito.

In ogni caso, l'esempio ha mostrato una 'specie (...) (array)!;' Lambda ma quando tento il codice DMD non compilarlo.

Ecco il codice bollito giù:

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

Quando provo a compilare questo codice, ottengo il seguente

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

Qualcuno può dirmi cosa devo fare qui?

Io uso DMD v2.031, ho cercato di installare il GDC ma questo sembra solo per supportare la specifica lingua v1. Ho iniziato solo guardando dil, quindi non posso commentare se questo supporta il codice di cui sopra.

È stato utile?

Soluzione

Prova ad aggiungere questo vicino alla parte superiore del file:

import std.algorithm;

Altri suggerimenti

Ecco un modo ancora più semplice per ottenere un file di input (da cmdline), ottenere linee / parole e stampare una tabella di parole frequencing, in ordine decrescente:

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

Bene, quasi 4 anni dopo ...: -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top