4

質問に基づいて、ユーザーはeachLine、最初の 99998 行でクロージャーを使用して反復することなく、100000 行のファイルの 99999 行目にアクセスしたいと考えていました。だから、私は彼が使用することを提案しました

file.readLines().reverse()[1]ファイルの 99999 行目にアクセスします。

これはプログラマーにとって論理的に魅力的です。しかし、私はこのメソッドの実装に関する複雑さについてかなり疑問を持っていました.

メソッドはreverse()、プログラマーから隠されている行の完全な反復の単なる抽象化ですか、それとも、必要な行に到達するためにできるだけ少ない行数で反復できるほどインテリジェントですか?

4

3 に答える 3

2

コードからわかるように、Javaでreverse()呼び出しCollections.reverseてリストを逆にします。

ただし、非変更コードには別のオプションがあります。を使用すると、 とlistIterator()でイテレータを取得して、リストをさかのぼることができます。hasPreviousprevious

// Our list
def a = [ 1, 2, 3, 4 ]
// Get a list iterator pointing at the end
def listIterator = a.listIterator( a.size() )
// Wrap the previous calls in another iterator
def iter = [ hasNext:{ listIterator.hasPrevious() },
             next:{ listIterator.previous() } ] as Iterator

次に、次のことができます。

// Check the value of 1 element from the end of the list
assert iter[ 1 ] == 3

ただし、これはすべて内部の ArrayList であるため、次のようにするだけで、ほぼ確実に高速になります (コードが読みやすくなります)。

assert a[ 2 ] == 3

すべての逆転ではなく。明らかに、これは私が正しいことを確認するためにプロファイリングが必要になります...

于 2012-07-25T08:05:55.530 に答える
0

この答え:

def a= [1, 2, 3, 4]
def listIterator= a.listIterator(a.size())
def iter= [hasNext: {listIterator.hasPrevious()},
              next: {listIterator.previous()}] as Iterator
assert iter[1] == 3

Groovy-1.7.2 以降でのみ動作します。

Groovy-1.7.1、1.7.0、1.7 ベータ、1.6、1.5、および 1.0-RC-01 に戻ると、プロキシの getAt(1) メソッド呼び出しが見つかりません。バージョン 1.0-RC-06 以前では、java.util.HashMap を java.util.Iterator にキャストできません。

于 2012-07-29T08:15:41.527 に答える
0

「Javadoc」によると、新しいリストを逆の順序で作成するだけです。

私が何かを見逃していない限り、カーソルをすぐにジャンプするのは賢明ではありません。私の理解では、配列としてインデックスが付けられている場合は直接アクセスできますが、そうでない場合は繰り返し処理する必要があります。


代替案は次のとおりです。

file.readLines().last()[-1]
于 2012-07-25T07:51:37.413 に答える