2009-08-11 38 views
7

Tôi đang cố gắng làm theo các ví dụ được đưa ra ở các vị trí khác nhau cho ứng dụng D. Nói chung khi học một ngôn ngữ tôi bắt đầu trên các ứng dụng ví dụ và thay đổi chúng bản thân mình, hoàn toàn là để kiểm tra các công cụ.Sắp xếp dựa trên các mảng liên kết trong D

Một ứng dụng bắt mắt là đếm tần số của các từ trong một khối văn bản được truyền vào. Từ điển được xây dựng trong một mảng kết hợp (với các yếu tố lưu trữ tần số, và các phím là các từ chính chúng), đầu ra không theo bất kỳ thứ tự cụ thể nào. Vì vậy, tôi đã cố gắng sắp xếp mảng dựa trên các ví dụ được đưa ra trên trang web.

Dù sao, ví dụ này cho thấy một loại lambda '(!) (Mảng);' nhưng khi tôi thử mã dmd sẽ không biên dịch nó.

Đây là luộc xuống mã:

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

Khi tôi cố gắng biên dịch mã này, tôi nhận được sau

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

bất cứ ai có thể cho tôi biết những gì tôi cần phải làm ở đây?

Tôi sử dụng DMD v2.031, tôi đã thử cài đặt gdc nhưng điều này dường như chỉ hỗ trợ thông số ngôn ngữ v1. Tôi chỉ bắt đầu nhìn vào dil, vì vậy tôi không thể bình luận về việc liệu điều này có hỗ trợ mã ở trên hay không.

+1

GDC là loại chết, LDC LLVM dựa đã đưa tôi t. – BCS

Trả lời

11

Hãy thử thêm này gần phía trên cùng của file:

import std.algorithm; 
+1

Doh! Cảm ơn, đó là công trình. Nó luôn luôn là những thứ đơn giản đó là khó khăn nhất để tìm thông tin trên! – GKelly

2

Dưới đây là một cách đơn giản hơn để có được một tập tin đầu vào (từ cmdline), có dòng/chữ và in ra bảng chữ frequencing, trong tự giảm dần theo thứ tự:

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

Vâng, gần 4 năm sau ... :-)

Các vấn đề liên quan