link 未来から過去へ表示(*)
link 過去から未来へ表示

link もっと前
   2013年 11月 27日 ---> 2013年 11月 27日
link もっと後

2013年 11月 27日

Scala ArrayBuffer のイテレータ

最近 Scala にチャレンジしていますが、イテレータの動きがよくわかりません。

Scala Documentation(リンク)には take(n) でイテレータが n 要素先に進む、という記述があるのですが、ArrayBuffer のイテレータはそうなっていません。たぶん。

下記のコードを使って確かめました。7要素持っているバッファから、2要素、3要素、4要素、と take(n) していくコードです。val it4 = take(4) は 4要素取ろうとしますが、要素が足りず 2要素しか取れないことを期待しています。

テストコード

val a = scala.collection.mutable.XXXXXX(0, 1, 2, 3, 4, 5, 6)

val it = a.iterator
val it2 = it.take(2)
val it3 = it.take(3)
val it4 = it.take(4) //実際には 2要素しか取れないはず

it2.toList
it3.toList
it4.toList
it.toList

まずは XXXXXX の部分を ListBuffer にします。結果は期待通りです。

ListBuffer のイテレータ
Welcome to Scala version 2.9.2 (OpenJDK Client VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val a = scala.collection.mutable.ListBuffer(0, 1, 2, 3, 4, 5, 6)
a: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3, 4, 5, 6)


scala> val it = a.iterator
it: Iterator[Int] = non-empty iterator

scala> val it2 = it.take(2)
it2: Iterator[Int] = non-empty iterator

scala> val it3 = it.take(3)
it3: Iterator[Int] = non-empty iterator

scala> val it4 = it.take(4)
it4: Iterator[Int] = non-empty iterator


scala> it2.toList
res0: List[Int] = List(0, 1)

scala> it3.toList
res1: List[Int] = List(2, 3, 4)

scala> it4.toList
res2: List[Int] = List(5, 6)

scala> it.toList
res3: List[Int] = List()

次に XXXXXX の部分を ArrayBuffer にします。take(n) 自体は成功しますが、イテレータは進まずに常に先頭の要素を指すイテレータが返されてしまいます。

ArrayBuffer のイテレータ
Welcome to Scala version 2.9.2 (OpenJDK Client VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val a = scala.collection.mutable.ArrayBuffer(0, 1, 2, 3, 4, 5, 6)
a: scala.collection.mutable.Buffer[Int] = ArrayBuffer(0, 1, 2, 3, 4, 5, 6)


scala> val it = a.iterator
it: Iterator[Int] = non-empty iterator

scala> val it2 = it.take(2)
it2: Iterator[Int] = non-empty iterator

scala> val it3 = it.take(3)
it3: Iterator[Int] = non-empty iterator

scala> val it4 = it.take(4)
it4: Iterator[Int] = non-empty iterator


scala> it2.toList
res0: List[Int] = List(0, 1)

scala> it3.toList
res1: List[Int] = List(0, 1, 2)

scala> it4.toList
res2: List[Int] = List(0, 1, 2, 3)

scala> it.toList
res3: List[Int] = List(0, 1, 2, 3, 4, 5, 6)

Iterator の Scala-doc(リンク)を見ると「take 呼んだ後のイテレータは再利用すんなボケナス(意訳)」って書いてあるように読めます。

じゃあイテレータを再利用して良いのはどういう場合?next() だけ?不便だなあ…。

編集者: すずき(更新: 2013年 11月 27日 20:04)

コメント一覧

  • よしだ 
    Scalaどうですか?
    Javaほとんどやったことない&コンパイルが必要(?)ということで敷居が高そうというイメージがあって手をだせていません。 
    (2013年12月02日 01:49:15)
  • すずき 
    >よしださん
    関数言語+オブジェクト指向、という方向は好きですが、使いこなせていないです。
    特に関数型言語の部分は馴染みがなくて使うのがキツイので、無視してBetter Javaとして使ってます。

    開発環境はIntelliJ IDEA&Scala Pluginを使いましたが、コンパイル環境の設定が良くわかりません…。
    GUIの開発環境が不要なら、Ant(makeのJava版)からもコンパイル可能です。今はAntよりMavenという話も聞きますが、使ったことないのでなんとも言えないです。

    Rubyのirb的な対話環境もあるので、ちょっと試すならそちらの方が良いです。Linuxならyumとかaptとかで簡単に入れられるはず。 
    (2013年12月02日 03:16:46)
  • よしだ 
    2年前にコップ本を読んで勉強しようとするも挫折した記憶がよみがえります。
    なんかいい題材があればいいのだけど。
    とりあえずapt-getしてみます。ありがとう!

    やっぱり val いっぱい使わないとメリットがでなかったりするのかしらね。 
    (2013年12月03日 01:10:12)
  • すずき 
    >よしださん
    私も 1冊目にオライリー「プログラミングScala」を選んでしまって、やっちまった感が満載です。
    今からさらにコップ本を読む気が起きません…。

    >なんかいい題材があればいいのだけど。
    Rubyから移植してみるのはどうでしょう?

    >やっぱり val いっぱい使わないとメリットがでなかったりするのかしらね。
    うーん、頑張ったら速くなるかもしれませんが…。この手の言語や、スクリプト言語に性能は期待してないです。
    とりあえず快適&簡潔に書ければそれで良しです。 
    (2013年12月03日 03:39:20)
open/close この記事にコメントする



link もっと前
   2013年 11月 27日 ---> 2013年 11月 27日
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 1/23 15:09

カレンダー

<2013>
<<<11>>>
-----12
3456789
10111213141516
17181920212223
24252627282930

最近のコメント 5件

  • link 20年12月20日
    すずき 「パック旅行や旅行代理店に割り当てられた専...」
    (更新:12/21 19:00)
  • link 20年12月20日
    hdk 「羽田鹿児島便、ANA直接予約はほとんどし...」
    (更新:12/21 08:17)
  • link 20年09月10日
    すずき 「追加情報。最新の Debian Test...」
    (更新:10/07 16:48)
  • link 20年09月20日
    hdk 「最近は音楽聞く時やビデオ視聴時はミニコン...」
    (更新:09/24 21:43)
  • link 20年09月20日
    すずき 「ありゃー、同じ壊れ方ですね。\n新たなヘ...」
    (更新:09/24 00:23)

最近の記事 3件

link もっとみる
  • link 21年01月22日
    すずき 「[苦境の ANA] 年末(2020年 12月 20日の日記参照)に...」
    (更新:01/23 15:09)
  • link 20年02月22日
    すずき 「[Zephyr を調べる - まとめリンク] 日記が増えすぎて、一...」
    (更新:01/18 20:33)
  • link 21年01月18日
    すずき 「[Debian Testing と Zephyr SDK その] ...」
    (更新:01/18 16:21)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報