我有以下D程序,它应该将输入行分组为3个小组。
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);
}
}
}
并给出以下输入
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
它产生输出。
0) Mercury
1) Venus
2) Earth
0) Jupiter
1) Saturn
2) Uranus
0) Pluto
在每次迭代时跳过边界处的线(火星和海王星不在输出中)。我做错了什么?
答案 0 :(得分:4)
stdin.byLineCopy
calls popFront
,意味着在同一输入流上对此进行重复调用将“跳过”元素。尝试在开始时只创建一次byLineCopy
范围:
void main()
{
auto r = stdin.byLineCopy;
while (!r.empty) {
foreach (i, e; r.take(3).enumerate) {
writefln("%d) %s", i, e);
}
}
}
您无需检查eof
,因为byLineCopy
应处理该问题。
答案 1 :(得分:1)
听起来像是你想要std.range.chunks
,再加上std.range.enumerate
来保存索引:
void main()
{
foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) {
writefln("%s", chunk);
}
}
请注意,.array
需要chunks
,ForwardRange
需要stdin.byLineCopy
而InputRange
是$Paths = /some/path/1/ /some/path/2/ /some/path/3/
$Paths = $Paths.Remove($Paths.Length - 1)
$Index = $Paths.LastIndexOf('/')
$ID = $Paths.Substring($Index + 1)
。