2017-02-18 5 views
2

다음 코드 조각 갖는 : 나는 필사적으로 .group.array이 필요하다는 것을 발견했다.sort를 사용하려면 .group 후에 .array가 필요한 이유는 무엇입니까?

import std.algorithm : filter, canFind, map, splitter, group, sort; 
import std.stdio : File, writefln; 
import std.range : array; 

void main(string[] args) 
{ 
    string filename = "/var/log/dpkg.log"; 

    string term = args[1]; 
    auto results = File(filename, "r") 
        .byLine 
        .filter!(a => canFind(a, term)) 
        .map!(a => splitter(a, ":").front) 
        .group 
        .array // why is this crucial ? 
        .sort!((a,b) => a[1] > b[1]); 

    foreach (line; results) 
     writefln("%s => %s times", line[0], line[1]); 
} 

합니다. 아무도 왜 그런지 말할 수 있습니까?

내가 그것을 제거하자마자 나는 다음과 같은 컴파일러 오류 얻을 : group의 결과가 게으르게-평가 순서이지만, sort 완전히에서 메모리로는 전체 입력을 요구

main.d(16): Error: template std.algorithm.sorting.sort cannot deduce function from argument types !((a, b) => a[1] > b[1])(Group!("a == b", MapResult!(__lambda3, FilterResult!(__lambda2, ByLine!(char, char))))), candidates are: 
/usr/include/dmd/phobos/std/algorithm/sorting.d(1830):  std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range) 
+0

'group'은 정렬에 따라 달라집니다. groups __consecutively__ 동일한 요소를 요소의 단일 튜플과 반복 횟수로 그룹화합니다. [문서보기] (https://dlang.org/phobos/std_algorithm_iteration.html#.group) – greenify

답변

7

을, 예 배열. array 함수는 group에 의해 생성 된 지연 시퀀스를 취해 sort이 처리 할 수있는 배열에 저장합니다.

+0

좋습니다! 그게 내가 원하는거야. – Patryk