9

string が与えられた場合、stringその中の行を数える最速/最も効率的な方法は何ですか? Rebol のどのフレーバーについてもベストアンサーを受け入れます。私は、parse [some [thru]]組み合わせが文字列をトラバースする最速の方法であるという仮定の下で作業してきましたが、確かにそれがわからないため、SOに目を向けます:

count-lines: func [string [string!] /local count][
    parse/all string [
        (count: 1) some [thru newline (count: count + 1)]
    ]
    count
]

または:

count-lines: func [string [string!] /local count][
    count: 0
    until [
        count: count + 1
        not string: find/tail string newline
    ]
    count
]

そして、カウンターはどうですか?繰り返しはどのくらい効率的ですか?

count-lines: func [string [string!]][
    repeat count length? string [
        unless string: find/tail string newline [
            break/return count
        ]
    ]
]

更新:行数はテキスト エディターの原則に従います:

空の TextMate ドキュメント

空のドキュメントの行数は 1 のままです。そう:

>> count-lines ""
== 1
>> count-lines "^/"
== 2
4

9 に答える 9

4
count-lines: func [
    str
    /local sort-str ][
sort-str: sort join str "^/"
1 + subtract index? find/last sort-str "^/" index? find sort-str "^/"
]
于 2013-02-13T12:12:03.473 に答える
4

BrianH によって提案された拡張 PARSE バージョン:

i: 1 ; add one as TextMate
parse text [any [thru newline (++ i)]]
print i
于 2013-02-19T22:44:26.557 に答える
3

parse私が考えることができる最高のシンプルな非バージョンは次のとおりです。

count-lines: function [text [string!]] [
    i: 1
    find-all text newline [++ i]
    i
]

Rebol の最近のバージョン、およびR3 または R2/Forward のいずれかを使用functionします。ソースを見て、見つけたものをインライン化して最適化することもできますが、このような状況はまさに私たちが書いたものなので、それを使用してみませんか?++find-allfind-allfind-all

于 2013-02-20T18:37:08.673 に答える
2

なぜ誰も最も簡単な解決策を思いつかなかったのだろうか:)

t: "abc^/de^/f^/ghi"
i: 0 until [i: i + 1 not t: find/tail t newline] i
== 4

パフォーマンスについてはよくわかりませんが、UNTIL と FIND がネイティブなので、かなり速いと思います。WHILE も使用できます。

i: 1 while [t: find/tail t newline] [i: i + 1] i
== 4

空の文字列を確認するだけです。また、関数の場合は、引数シリーズを HEAD する必要があります。

于 2013-02-21T12:15:54.200 に答える
2

remove-each はネイティブなので高速です

s: "1^/2^/3"
a: length? s
print a - length? remove-each v s [v = #"^/"]
; >> 2

または関数として

>> f: func [s] [print [(length? s) - (length? remove-each v s [v = #"^/"])]]
>> f "1^/2^/3"
== 2
于 2013-02-18T08:57:19.673 に答える
2

これが私にとって最高です:

temp: read/lines %mytext.txt
length? temp
于 2013-02-08T08:49:10.017 に答える
1

パフォーマンスと最後の行のルール (r3) についてはわかりません。

>> length? parse "1^/2^/3" "^/"
== 3
于 2013-02-11T01:39:38.990 に答える