2017-04-24 16 views
6

tôi có chương trình D sau đó là nghĩa vụ để dòng đầu vào nhóm thành các nhóm kích thước 3.Dlang byLineCopy dòng bỏ qua

import std.stdio; 
import std.range; 
import std.array; 

void main() 
{ 
    while (!stdin.eof) { 
    auto currentBlock = array(take(stdin.byLineCopy, 3)); 

    foreach (i, e; currentBlock) { 
     writefln("%d) %s", i, e); 
    } 
    } 
} 

và đưa đầu vào sau

Mercury 
Venus 
Earth 
Mars 
Jupiter 
Saturn 
Uranus 
Neptune 
Pluto 

nó tạo ra đầu ra.

0) Mercury 
1) Venus 
2) Earth 
0) Jupiter 
1) Saturn 
2) Uranus 
0) Pluto 

bỏ qua dòng ở đường viền trên mỗi lần lặp (Sao Hỏa và Sao Hải Vương không ở đầu ra). Tôi đang làm gì sai?

+0

hm có vẻ như một lỗi trong chức năng thực hiện đối với tôi. Nếu bạn muốn một số chức năng khác trong khi chờ đợi để đạt được điều tương tự, hãy sử dụng '.chunks (3)' trả về một phạm vi 3 phạm vi chiều dài – WebFreak001

+0

@ WebFreak001 'chunks' không hoạt động đối với tôi. Có vẻ 'byLineCopy' trả về một' InputRange' và 'chunks' mong đợi một' ForwardRange'. –

Trả lời

4

stdin.byLineCopycallspopFront, có nghĩa là các cuộc gọi lặp lại đến cùng một luồng đầu vào sẽ 'bỏ qua' phần tử. Hãy thử tạo một loạt byLineCopy chỉ một lần vào lúc bắt đầu:

void main() 
{ 
    auto r = stdin.byLineCopy; 
    while (!r.empty) { 
     foreach (i, e; r.take(3).enumerate) { 
      writefln("%d) %s", i, e); 
     } 
    } 
} 

Bạn không cần phải kiểm tra cho eof, như byLineCopy nên xử lý đó.

+0

Giải pháp này có hành vi tôi muốn. Đây không phải là lỗi trong 'byLineCopy'? –

+0

Tôi không mong đợi việc tạo một dải ô để thay đổi nguồn. Phạm vi 'API' nói rằng chúng ta nên gọi 'front', rồi' popFront'. Tuy nhiên, điều này không hoàn toàn phù hợp với 'stdin', nơi bạn phải nâng cấp nó để truy cập' front' lần đầu tiên, có nghĩa là chúng ta cần 'popFront' ban đầu để làm mọi thứ. Bạn có thể gọi nó là một lỗi, tôi gọi nó là một thực tế không may :) – rcorre

1

Âm thanh như bạn muốn std.range.chunks, kết hợp với std.range.enumerate để duy trì các chỉ số:

void main() 
{ 
    foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) { 
     writefln("%s", chunk); 
    } 
} 

Lưu ý rằng .array là cần thiết như chunks đòi hỏi một ForwardRange khi stdin.byLineCopy là một InputRange.

+1

Giải pháp của bạn hoạt động. Nhưng, tôi muốn tránh chi phí của việc giữ toàn bộ đầu vào trong một mảng (tôi tin rằng đây là những gì '.array' không) khi tôi chỉ cần một phần nhỏ của nó trong bộ nhớ tại một thời điểm. Đây là một trong những lý do tại sao tôi sử dụng 'take' thay vì' chunks' ngay từ đầu. –

+0

Tôi hiểu. Tôi nghĩ rằng tôi đã cung cấp một câu trả lời tốt hơn bây giờ. Tôi sẽ xóa cái này nếu nó không thêm bất kỳ giá trị nào. – rcorre

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