2011-10-01 7 views
12

takeというメソッドの動作が混乱しているIterator。それは商品を消費していないようです。ここでの例である:スカラ反復子からのアイテムを消費する

scala> Iterator(1,2,3) 
res0: Iterator[Int] = non-empty iterator 

scala> res0 take 2 toArray 
res1: Array[Int] = Array(1, 2) 

scala> res0.next 
res2: Int = 1 

明らかステップ2は、2つのアイテムを消費するが、ステップ3でIteratorは、最初のアイテムのままです。実装を見ると、どんな種類のコピーやバッファリングも見ることができません。新しく追加されたものはIteratorです。どうすればそれが可能なのでしょうか?どのように私は本当にnアイテムを消費することができますか?

答えて

10

このイテレータはIndexedSeqLike#Elementssource)で定義されています。 A は、反復子の実装が異なれば、takeという一貫性のない動作に関するものです。

実際にN個のアイテムを消費するには、Iterator#nextをN回呼び出してください。

Streamを使用することをお勧めします(Iteratorのように)、遅延もありません(Iteratorと異なります)。

scala> val s = Stream(1, 2, 3) 
s: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> s.take(2).toList 
res43: List[Int] = List(1, 2) 

scala> s.take(2).toList 
res44: List[Int] = List(1, 2) 

scala> s.drop(2).toList 
res45: List[Int] = List(3) 

scala> {val (s1, s2) = s.splitAt(2); (s1.toList, s2.toList)} 
res46: (List[Int], List[Int]) = (List(1, 2),List(3)) 
+0

ありがとうretronym、私はポイントを参照してください。私が「ストリーム」を破棄した理由は、「現在のアイテム・ポインタ」のようなものがなかったことです(ちなみに、おそらくJavaの影響のために、いわゆるものに期待できるもの)。今私は、 ''現在のポインタ ''を ''ドロップ 'のシーケンスで取得し、 ''頭部'を見ることができることを見ています。私はもう一度やり直します。 – jglatre

1

商品を消費する場合は、dropです。 Iteratorで呼び出されるほとんどのメソッドは、それ以降の使用には役に立ちません。つまり、動作は定義されず、変更される可能性があります。

+0

'drop'は実際には' take'と同じ矛盾します。 '{val i = Iterator(1,2,3); i.drop(1); i.next} 'は' 2'ではなく '1'を返します。 – retronym

+1

@retronym 'i'で' drop'を呼び出すと、 'i'はそれ以上確実に使用できなくなります。代わりに、 'drop'が返すものを使用しなければなりません。 –

+0

良い点。 '{val i = Iterator(1,2,3); 'next()'と 'hasNext()'(潜在的に)は元のイテレータを無効にします。これらのメソッドは、新しい*有効なイテレータを返すかもしれません。これを明確にするためにドキュメントの投稿を楽しみにしています。 – retronym

2

ありがとうございます。

これはIteratorからのアイテムの束を消費する私のソリューションです:

implicit def consumable(i: Iterator[_]) = new { 
    def next(n: Int) = { 
     (for (_ <- 1 to n) yield i.next()).iterator 
    } 
    def skip(n: Int) { 
     (1 to n).foreach(_ => i.next()) 
    } 
    } 

任意のコメントは歓迎されます。

+0

戻り値の型と一致するように定義する必要があります。 implicit def consumable [T](i:Iterator [T])それ以外の場合は、Iterator [Any] – Miquel

関連する問題