タグ付けされた質問 「iterator」

イテレータは、オブジェクト指向のプログラミングパターンであり、コレクションを通過し、物理メモリ内の実際の実装やオブジェクトアドレスに依存しません。これは、ギャングオブフォーの行動設計パターンの1つです。



3
JavaScript-myArray.forEachとforループのニュアンス
私は使用を提案する多くの質問を見てきました: for (var i = 0; i < myArray.length; i++){ /* ... */ } の代わりに: for (var i in myArray){ /* ... */ } 配列の場合、一貫性のない反復のため(ここを参照)。 しかし、オブジェクト指向ループを好むように見えるものを見つけることができないようです: myArray.forEach(function(item, index){ /* ... */ }); これは私にはもっと直感的に思えます。 現在のプロジェクトでは、IE8の互換性が重要であり、Mozillaのポリフィルの使用を検討していますが、これがどのように機能するかは100%わかりません。 標準のforループ(上記の最初の例)と最近のブラウザーによるArray.prototype.forEach実装の間に違いはありますか? 最近のブラウザーの実装と上記にリンクされているMozillaの実装(特にIE8に関連)の間に違いはありますか? パフォーマンスはそれほど問題ではなく、反復されるプロパティとの一貫性のみです。

7
JavaScriptでオブジェクトを反復できないのはなぜですか?
オブジェクトがデフォルトで反復できないのはなぜですか? オブジェクトの反復に関連する質問が常にあります。一般的な解決策は、オブジェクトのプロパティを反復し、その方法でオブジェクト内の値にアクセスすることです。これは非常に一般的であるため、オブジェクト自体が反復可能ではないのはなぜか疑問に思います。 ES6のようなステートメントは、for...ofデフォルトでオブジェクトに使用すると便利です。これらの機能は、{}オブジェクトを含まない特別な「反復可能なオブジェクト」でのみ使用できるため、使用するオブジェクトに対してこれを機能させるには、フープを実行する必要があります。 for ... ofステートメントは、反復可能なオブジェクト (Array、Map、Set、argumentsオブジェクトなどを含む)を反復処理するループを作成します。 たとえば、ES6ジェネレーター関数を使用します。 var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}}; function* entries(obj) { for (let key of Object.keys(obj)) { yield [key, obj[key]]; } } for (let [key, value] of entries(example)) { console.log(key); console.log(value); for (let [key, …

13
統計的中央値、最頻値、歪度、尖度を推定するための「オンライン」(イテレーター)アルゴリズム?
値のセットの中央値、最頻値、歪度、および/または尖度を推定するアルゴリズムはありますが、すべての値を一度にメモリに保存する必要はありませんか? 基本的な統計を計算したいのですが: 平均:算術平均 分散:平均からの偏差の2乗の平均 標準偏差:分散の平方根 中央値:数値の大きい方の半分を小さい方の半分から分離する値 モード:セットで見つかった最も頻繁な値 歪度:tl; 博士 尖度:tl; 博士 これらのいずれかを計算するための基本的な式は、小学校の算数であり、私はそれらを知っています。それらを実装する多くの統計ライブラリもあります。 私の問題は、処理しているセット内の値の数が多い(数十億)ことです。Pythonで作業していると、数十億の要素でリストやハッシュを作成することはできません。これをCで書いたとしても、10億要素の配列はあまり実用的ではありません。 データはソートされていません。他のプロセスによって、オンザフライでランダムに生成されます。各セットのサイズは非常に可変であり、サイズは事前にわかりません。 セット内の各値を任意の順序で反復して、平均と分散をかなりうまく処理する方法をすでに理解しました。(実際、私の場合は、生成された順序でそれらを取得します。)これが私が使用しているアルゴリズムです。礼儀http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm: count、sum、sum_of_squaresの3つの変数を初期化します 各値について: インクリメントカウント。 合計に値を追加します。 値の2乗をsum_of_squaresに追加します。 合計をカウントで除算し、変数の平均として保存します。 sum_of_squaresをカウントで除算し、変数mean_of_squaresとして格納します。 二乗平均、square_of_meanとして保存。 mean_of_squaresからsquare_of_meanを減算し、分散として保存します。 出力の平均と分散。 この「オンライン」アルゴリズムには弱点があります(たとえば、sum_of_squaresが整数範囲または浮動小数点精度よりも急速に大きくなるための精度の問題)が、基本的に、各セットにすべての値を格納する必要がなく、必要なものが得られます。 しかし、追加の統計(中央値、最頻値、歪度、尖度)を推定するための同様の手法が存在するかどうかはわかりません。N値を処理するために必要なメモリがO(N)よりも大幅に少ない限り、偏りのある推定量、またはある程度精度を損なう方法でさえ生きることができます。 ライブラリにこれらの操作の1つ以上を「オンライン」で計算する関数がある場合は、既存の統計ライブラリを指すことも役立ちます。

5
ruby 1.8.6(each_char)の文字列の各文字を反復処理する
私はrubyを初めて使用し、現在、rubyのベース文字列とは別に各文字を操作しようとしています。私はruby1.8.6を使用していて、次のようなことをしたいと思っています。 "ABCDEFG".each_char do |i| puts i end これにより、未定義のメソッド「each_char」エラーが発生します。 私は次の垂直出力を見ることを期待していました: A B C D ..etc あるeach_charだけ1.9用に定義された方法は?プレーンeachメソッドを使用してみましたが、ブロックは文字列全体を1行に出力するだけです。これを行う方法を理解する唯一の方法は、かなり不便ですが、最初から文字の配列を作成することです。 ['A','B','C','D','...'].each do|i| puts i end これにより、目的の出力が得られます。 A B C ..etc そもそも変更されていない文字列を使用してこの出力を達成する方法はおそらくありますか? Javaに相当するものは次のとおりです。 for (int i = 0; i < aString.length(); i++){ char currentChar = aString.charAt(i); System.out.println(currentChar); }
86 ruby  string  iterator 

5
foreachを最初に使用した以外の要素から反復を開始することは可能ですか?
カスタムコレクション(ツリー)にIEnumerableを実装して、foreachを使用してツリーをトラバースできるようにすることを考えています。ただし、私が知る限り、foreachは常にコレクションの最初の要素から始まります。foreachが開始する要素を選択したいと思います。foreachが始まる要素をどうにかして変更することは可能ですか?


1
range()がPython 3.3のジェネレーターである場合、範囲でnext()を呼び出せないのはなぜですか?
ウェブ上の誤った情報の犠牲になっているかもしれませんが、何かを誤解している可能性が高いと思います。私がこれまでに学んだことに基づいて、range()はジェネレーターであり、ジェネレーターはイテレーターとして使用できます。ただし、このコード: myrange = range(10) print(next(myrange)) 私にこのエラーを与えます: TypeError: 'range' object is not an iterator ここで何が欠けていますか?これが0を出力し、の次の値に進むことを期待していましたmyrange。私はPythonを初めて使用するので、かなり基本的な質問についてお詫びしますが、他の場所で適切な説明を見つけることができませんでした。

9
Pythonジェネレーターを使用するのに適した時期ではないのはいつですか?
これは、Pythonジェネレーター関数を何に使用できるかという逆です。:Pythonジェネレーター、ジェネレーター式、およびitertoolsモジュールは、最近のpythonの私のお気に入りの機能の一部です。これらは、大量のデータに対して実行する一連の操作を設定するときに特に役立ちます。DSVファイルを処理するときによく使用します。 それで、それはいつですか 、ジェネレーター、ジェネレーター式、またはitertools関数を使用するのが適切ないのですか? ときに私が好むはずですzip()以上itertools.izip()、または range()以上xrange()、または [x for x in foo] 以上 (x for x in foo)? 明らかに、最終的にはジェネレーターを実際のデータに「解決」する必要があります。通常は、リストを作成するか、ジェネレーター以外のループでリストを反復処理します。長さを知る必要がある場合もあります。これは私が求めているものではありません。 中間データ用に新しいリストをメモリに割り当てないように、ジェネレータを使用します。これは、特に大きなデータセットに適しています。小さなデータセットにも意味がありますか?顕著なメモリ/ CPUのトレードオフはありますか? リスト内包表記のパフォーマンスとmap()およびfilter()の目を見張るような議論に照らして、誰かがこれについてプロファイリングを行った場合は特に興味があります。(代替リンク)

18
反復中にコレクションに要素を追加する
コレクションを反復処理しながら要素をコレクションに追加することは可能ですか? 具体的には、コレクションを繰り返し処理したいと思います。要素が特定の条件を満たす場合は、コレクションに他の要素を追加し、これらの追加された要素も繰り返し処理されるようにします。(私はこれが可能であることを理解していますループが終了しない性があるていますが、私の場合はそうではないと確信しています。) Javaチュートリアル日からはこれが不可能であることを示唆している:「メモIterator.removeであるだけに反復中にコレクションを変更する安全な方法を、繰り返し処理の進行中に、基礎となるコレクションは他の方法で変更された場合の動作は不定です。」 では、イテレータを使用してやりたいことができない場合は、どうすればよいでしょうか。
82 java  iterator 

10
C#でyield returnイテレータを使用する目的/利点は何ですか?
yield return x;C#メソッド内での使用について私が見たすべての例は、リスト全体を返すだけで同じ方法で実行できます。そのような場合、yield return構文を使用することとリストを返すことの利点または利点はありますか? また、yield return完全なリストを返すことができなかったシナリオの種類は何ですか?

3
Array.fromでグループ化される文字は何ですか?
私はJSをいじっていますが、JSを使用して、作成された配列に追加する要素をJSがどのように決定するのかわかりませんArray.from()。たとえば、次の絵文字👍はlength2のコードポイントで構成されているため、2ですが、Array.from()これらの2つのコードポイントを1つとして扱い、1つの要素を持つ配列を提供します。 const emoji = '👍'; console.log(Array.from(emoji)); // Output: ["👍"] コードスニペットを実行する結果を非表示スニペットを展開 ただし、他の一部の文字には、この文字のように2つのコードポイントがषिあります(a .lengthも2です)。ただし、Array.fromこの文字を「グループ化」せず、代わりに2つの要素を生成します。 const str = 'षि'; console.log(Array.from(str)); // Output: ["ष", "ि"] コードスニペットを実行する結果を非表示スニペットを展開 私の質問は次のとおりです。文字が2つのコードポイントで構成されている場合、文字が分割されるか(例2のように)、または1つの要素として処理されるか(例1のように)を決定するのは何ですか。

2
JavaScript ES6では、イテラブルとイテレーターの違いは何ですか?
イテラブルはイテレーターと同じですか、それとも異なりますか? と思われる仕様から、反復可能なオブジェクトである、と言う、objそのように、obj[Symbol.iterator]呼び出されたときに、あるオブジェクトを返すように、機能を指しnext返すことができます方法{value: ___, done: ___}:オブジェクトを function foo() { let i = 0; const wah = { next: function() { if (i <= 2) return { value: (1 + 2 * i++), done: false } else return { value: undefined, done: true } } }; return wah; // wah is iterator …

1
removeIf実装の詳細
で理解できない小さな実装の詳細な質問がありArrayList::removeIfます。最初にいくつかの前提条件がないと、単純にそれを置くことができないと思います。 そのため:とは異なり、実装は基本的にバルク です。例は物事を非常に理解しやすくするはずです。私がこのリストを持っているとしましょう:removeArrayList::remove List<Integer> list = new ArrayList<>(); // 2, 4, 6, 5, 5 list.add(2); list.add(4); list.add(6); list.add(5); list.add(5); そして、私は偶数であるすべての要素を削除したいと思います。私はそれをできた: Iterator<Integer> iter = list.iterator(); while (iter.hasNext()) { int elem = iter.next(); if (elem % 2 == 0) { iter.remove(); } } または: list.removeIf(x -> x % 2 == 0); 結果は同じですが、実装は大きく異なります。はのiteratorビューなので、ArrayListを呼び出すたびremoveに、基になるものArrayListを「良好」な状態にする必要があります。つまり、内部配列は実際に変更されます。この場合も、の呼び出しごとにremove、System::arrayCopy内部で呼び出しが行われます。 …
9 java  java-8  iterator 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.