VBAでは複数データを格納できるデータ型として、配列とコレクションがある。 それぞれ一長一短あり、どちらが優れているというものではないのだが、どちらかといえばデータの追加・削除が簡単に行えるコレクションのほうが使い勝手は良いかもしれない。 さて、今回は配列とコレクションのデータ構造に焦点を当ててそれぞれの違いを説明する。 配列のデータ構造 例えばInteger型の配列を次のように作成する。 Dim Arr(3) As Integer Arr(0) = 10 Arr(1) = 20 Arr(2) = 30 Arr(3) = 40 すると、メモリ上には単に直列にデータが並ぶ。VBAのIntegerは2バイトなので、ちょうど2バイトずつ隙間なく配置される。 もし次のようにLong型で宣言したら、 Dim Arr(3) As Long Arr(0) = 100 Arr(1) = 200 Arr(2
ExcelのVBAでプログラムを組む際に、大量のデータを処理するのに使うのが配列系の処理である。ただ、プログラムの組み方によっては処理時間に大きく差が出てくるようだ。データ量が少なければよいが、多くなってくると、処理時間が延びてしまい、使い勝手も悪くなる。そこでベストな配列の使い方を考慮してみる。 VBAでは主に配列として使えるのが、静的配列、動的配列、コレクションである。3択になるわけだがどれを選ぶのがよいだろうか? 試しに単純に変数を宣言して、適当なデータ(10,000,000個)を配列に書き込む時間を測定してみた。できるだけ高速で処理時間を短縮できるものを選択したい。 静的配列 Dim Dimtest(10000000) As String Do DoEvents Dimtest(i) = "テスト" & i If i = 10000000 Then Exit Do End If i
VBScriptには辞書型のオブジェクト Scripting.Dictionary があります。 が、このオブジェクトにはちょっとした罠が潜んでいます。 それは「存在しないキーに対して値を取得しようとするとキーを作成してしまう」というものです。 項目を変更するときに引数 key で指定したキーが見つからない場合、newitem で指定した項目と関連付けられた、引数 key で指定した新しいキーが作成されます。また、既存の項目を取得するときに引数 key で指定したキーが見つからない場合は、空の項目と関連付けられた、引数 key で指定した新しいキーが作成されます。 以下、実際に試したコードです。 Option Explicit Dim objDict, sKey Set objDict = CreateObject("Scripting.Dictionary") ' "hoge" キーを追
Javaの下巻で勉強したコレクションクラスでのArrayListとLinkedListについてのお話。 Javaを結構勉強している人は間違いがないかご確認下さい(笑 今回の日記では、ArrayListとLinkedListの使い分けに絡めて、for文と拡張for文およびIteratorではどちらの方がアクセス速度が早いのか、といったところです。 さて、私はこの2つのクラスを今までは、何となくスタックの機能使いたいからLinkedListで、それ以外はArrayListでいいかなと言った感じで使ってました。 はい、ダメダメですね。 何がダメかと言うと、次の特徴を見れば分かると思います。 2つのリストにおける最大の特徴 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, ja
ハッシュオブジェクトは範囲オブジェクトや配列オブジェクトと同じく複数の要素を持つオブジェクトです。繰り返し処理を使うことでハッシュオブジェクトから順に要素を取得して処理を行うことができます。ここでは Ruby でハッシュオブジェクトに対して繰り返し処理を行う方法を解説します。
I want to implement Lisp's mapcar in Ruby. Wishful syntax: mul = -> (*args) { args.reduce(:*) } mapcar(mul, [1,2,3], [4,5], [6]) would yield [24, nil, nil]. Here is the solution I could think of: arrs[0].zip(arrs[1], arrs[2]) => [[1, 4, 6], [2, 5, nil], [3, nil, nil]] Then I could: [[1, 4, 6], [2, 5, nil], [3, nil, nil]].map do |e| e.reduce(&mul) unless e.include?(nil) end => [24, nil, nil] But I'
sort -> Array[permalink][rdoc][edit] sort! -> self sort {|a, b| ... } -> Array sort! {|a, b| ... } -> self 配列の内容をソートします。要素同士の比較は <=> 演算子を使って行います。sort はソートされた配列を生成して返します。 sort! は self を破壊的にソートし、self を返します。 ブロックとともに呼び出された時には、要素同士の比較をブロックを用いて行います。ブロックに2つの要素を引数として与えて評価し、その結果で比較します。ブロックは <=> 演算子と同様に整数を返すことが期待されています。つまり、ブロックは第1引数が大きいなら正の整数、両者が等しいなら0、そして第1引数の方が小さいなら負の整数を返さなければいけません。両者を比較できない時は nil を返します。
select -> Enumerator[permalink][rdoc][edit] filter -> Enumerator select {|item| ... } -> [object] filter {|item| ... } -> [object] 各要素に対してブロックを評価した値が真であった要素を全て含む配列を返します。真になる要素がひとつもなかった場合は空の配列を返します。 ブロックを省略した場合は Enumerator を返します。 例 [1,2,3,4,5].select # => #<Enumerator: [1, 2, 3, 4, 5]:select> [1,2,3,4,5].select { |num| num.even? } # => [2, 4] [SEE_ALSO] Enumerable#select [SEE_ALSO] Array#select!
keys -> [object][permalink][rdoc][edit] 全キーの配列を返します。 例 h1 = { "a" => 100, 2 => ["some"], :c => "c" } p h1.keys #=> ["a", 2, :c] [SEE_ALSO] Hash#values,Hash#to_a
ビットフィールド (英: bit field) は、プログラミングにおいてブーリアン型のフラグをコンパクトなビットの並びとして格納する手法である。ビットフィールドの格納には、整数型を使用する。個々のフラグは、ビット単位で格納される。通常は、ソースコードで、個別のビットがフラグに対応する意味を付けられた、2の冪乗の定数が定義される。ビット演算の論理積・論理和・否定の組み合わせが、フラグのセット・リセットとテストを行うために使われる。 ビットフィールドはビット配列(英語版)とは異なる。ビット配列は、整数でインデックスを付けられた大きなビットの集合を保存するために使用され、コンピュータ言語でサポートされる整数型よりも大きいことがある。一方、ビットフィールドは典型的にはワードサイズの範囲内であり、各ビットを参照する表記法は数値によるインデックスから独立している。ただし、ビットフィールドを用いるより
merge(*others) -> Hash[permalink][rdoc][edit] merge(*others) {|key, self_val, other_val| ... } -> Hash selfとothersのハッシュの内容を順番にマージ(統合)した結果を返します。デフォルト値はselfの設定のままです。 self と others に同じキーがあった場合はブロック付きか否かで判定方法が違います。ブロック付きのときはブロックを呼び出してその返す値を重複キーに対応する値にします。ブロック付きでない場合は常に others の値を使います。 othersがハッシュではない場合、othersのメソッドto_hashを使って暗黙の変換を試みます。 [PARAM] others: マージ用のハッシュまたはメソッド to_hash でハッシュに変換できるオブジェクトです。 [RET
コンストラクタが特に何もしてくれず、インスタンス作ってから初期化しないといけないタイプのクラスってありますよね。シリアライズのためだったりJavaBeansだったり、あとはふつーのArrayListだから作ってから内容詰め込みます、みたいに。 オブジェクト作ってreturnしたいだけなのに、作ったあとに初期化しないといけないから一時変数作るのがいつも一手余分で、一行で書けるラムダ式がブロックラムダになったりするといらいらもたまるというものです。 C#にはオブジェクト初期化子があるのでその余分な一手が省けますね。 return new Person { Name = "Alice", Age = 20 }; return new List<int> { 1, 1, 2, 3, 5, 8, }; return new Dictionary<int, String> { { 200, "OK"
昨年のjClarityのインタビューで、GS Collectionsを便利に使ういくつかの機能の組み合わせを紹介しました。元記事はこちらから読むことができます。 Java 8がリリースされ、Stream APIが提供されている今となっては、なぜGS Collectionsを使う必要があるのか疑問に思うかもしれません。Stream APIはJavaコレクションフレームワークにとって大きな前進ではありますが、必要な機能がすべて実装されているわけではありません。上の表にもあるように、GS CollectionsではMultimapやBag、イミュータブルなコンテナ、プリミティブ型専用のコンテナなどが提供されています。HashSetやHashMapをより最適化した代替実装や、それらの利点を生かしたBagやMultimapの実装などもあります。GS Collectionsのイテレーションパターンはコ
Listが大好きでJavaBeanを作るのは嫌だったんでしょうか。 担当者が途中でギブアップして作れなくなってしまい、続きをなんとか作ってくれとお願いされ 渡されたソースがこんな感じだったそうです。 public class GyoumGamen1 { public List<List> getData() { List<List> list = new ArrayList<List>(); List subList1 = new ArrayList(); subList1.add(1); subList1.add("ColumnDataA1"); subList1.add(2); subList1.add("ColumnDataB1"); list.add(subList1); List subList2 = new ArrayList(); subList2.add(1); subLi
配列の要素としてある特定の値が含まれているかどうか、チェックしたい場合にどうしたらよいか説明します。 例えば "カレー", "ラーメン", "ハンバーグ" という三つの文字列の要素を値として持っている配列があった時に、 その中に "ホットドッグ" があるかどうかチェックする場合です。この場合は存在しないので false を返すことを考えます。 "ラーメン" があるかどうか、といえば、"ラーメン" は要素に含まれるので true を返す、というような場合です。 配列の操作のための java.util.Arrays クラス さて 「要素の中に特定の値を含むかどうか」 というチェックといえば、コレクションの contains メソッドがあります。 contains メソッドはまさに今ここで望んでいる動作をします。 しかしながら、あいにく配列では contains メソッドがありません。 では、ど
次のコードのように反復中にそのコレクションを削除しようとすると、ConcurrentModificationExceptionが発生してしまいます。 Set<Integer> set = new HashSet<Integer>(); for (int i = 0 ; i < 10 ; i++) { set.add(i); } // このループで例外発生 for (Integer currValue : set) { if (currValue % 2 == 0) { set.remove(currValue); } } for (Integer currValue : set) { System.out.println(currValue + " "); } これを回避するために、反復中に削除せず、削除対象をまず保持しておき、その後でまとめて削除するという方法です。 Set<Intege
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く