タグ

Collectionに関するkiyo_hikoのブックマーク (49)

  • Converting VBA Collection to Array

    kiyo_hiko
    kiyo_hiko 2024/02/07
    ありがたい…。
  • VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する - t-hom’s diary

    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

    VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する - t-hom’s diary
    kiyo_hiko
    kiyo_hiko 2019/05/09
    コレクションが連結リストな話
  • エクセルVBA 配列の速度比較

    ExcelVBAでプログラムを組む際に、大量のデータを処理するのに使うのが配列系の処理である。ただ、プログラムの組み方によっては処理時間に大きく差が出てくるようだ。データ量が少なければよいが、多くなってくると、処理時間が延びてしまい、使い勝手も悪くなる。そこでベストな配列の使い方を考慮してみる。 VBAでは主に配列として使えるのが、静的配列、動的配列、コレクションである。3択になるわけだがどれを選ぶのがよいだろうか? 試しに単純に変数を宣言して、適当なデータ(10,000,000個)を配列に書き込む時間を測定してみた。できるだけ高速で処理時間を短縮できるものを選択したい。 静的配列 Dim Dimtest(10000000) As String Do DoEvents Dimtest(i) = "テスト" & i If i = 10000000 Then Exit Do End If i

    エクセルVBA 配列の速度比較
    kiyo_hiko
    kiyo_hiko 2019/05/09
    意外にもコレクションが優秀であるという結果読んでビックリ
  • VBScriptのディクショナリの参照の罠 - Qiita

    VBScriptには辞書型のオブジェクト Scripting.Dictionary があります。 が、このオブジェクトにはちょっとした罠が潜んでいます。 それは「存在しないキーに対して値を取得しようとするとキーを作成してしまう」というものです。 項目を変更するときに引数 key で指定したキーが見つからない場合、newitem で指定した項目と関連付けられた、引数 key で指定した新しいキーが作成されます。また、既存の項目を取得するときに引数 key で指定したキーが見つからない場合は、空の項目と関連付けられた、引数 key で指定した新しいキーが作成されます。 以下、実際に試したコードです。 Option Explicit Dim objDict, sKey Set objDict = CreateObject("Scripting.Dictionary") ' "hoge" キーを追

    VBScriptのディクショナリの参照の罠 - Qiita
    kiyo_hiko
    kiyo_hiko 2019/04/24
    これはひどい仕様だ。説明がないと気づかない
  • 『Listのfor文と拡張for文およびIteratorの実行アクセス速度』

    Javaの下巻で勉強したコレクションクラスでのArrayListとLinkedListについてのお話。 Javaを結構勉強している人は間違いがないかご確認下さい(笑 今回の日記では、ArrayListとLinkedListの使い分けに絡めて、for文と拡張for文およびIteratorではどちらの方がアクセス速度が早いのか、といったところです。 さて、私はこの2つのクラスを今までは、何となくスタックの機能使いたいからLinkedListで、それ以外はArrayListでいいかなと言った感じで使ってました。 はい、ダメダメですね。 何がダメかと言うと、次の特徴を見れば分かると思います。 2つのリストにおける最大の特徴 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, ja

    『Listのfor文と拡張for文およびIteratorの実行アクセス速度』
    kiyo_hiko
    kiyo_hiko 2016/05/23
    暗黙のボクシングを挟むので差が出るらしいという話
  • ハッシュに対する繰り返し処理

    ハッシュオブジェクトは範囲オブジェクトや配列オブジェクトと同じく複数の要素を持つオブジェクトです。繰り返し処理を使うことでハッシュオブジェクトから順に要素を取得して処理を行うことができます。ここでは Ruby でハッシュオブジェクトに対して繰り返し処理を行う方法を解説します。

    ハッシュに対する繰り返し処理
    kiyo_hiko
    kiyo_hiko 2015/12/04
    hash.each { |k, v| ... } // each_key // each_value
  • Enumerable#include? (Ruby 3.3 リファレンスマニュアル)

    member?(val) -> bool[permalink][rdoc][edit] include?(val) -> bool val と == の関係にある要素を含むとき真を返します。 [PARAM] val: 任意のオブジェクト 例 [2, 4, 6].include? 2 #=> true [2, 4, 6].include? 1 #=> false [2, 4, 6].member? 2 #=> true [2, 4, 6].member? 1 #=> false

    kiyo_hiko
    kiyo_hiko 2015/11/24
    memberが使える。xs.member? x
  • Is it possible to iterate three arrays at the same time?

    We can iterate two arrays at the same time using Array's zip method like: @budget.zip(@actual).each do |budget, actual| ... end Is it possible to iterate three arrays? Can we use the transpose method to do the same?

    Is it possible to iterate three arrays at the same time?
    kiyo_hiko
    kiyo_hiko 2015/11/11
    すごい雑だがxs.zip(ys).zip(zs).map{ |xyz| xyz.flatten }的なものでやっつけた
  • How do I implement Common Lisp's mapcar in 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'

    How do I implement Common Lisp's mapcar in Ruby?
    kiyo_hiko
    kiyo_hiko 2015/11/11
    zip使ってmapcarもどき作る話。zipはreciever.zip(the_other)で二次元配列になる
  • Array#sort (Ruby 3.3 リファレンスマニュアル)

    sort -> Array[permalink][rdoc][edit] sort! -> self sort {|a, b| ... } -> Array sort! {|a, b| ... } -> self 配列の内容をソートします。要素同士の比較は <=> 演算子を使って行います。sort はソートされた配列を生成して返します。 sort! は self を破壊的にソートし、self を返します。 ブロックとともに呼び出された時には、要素同士の比較をブロックを用いて行います。ブロックに2つの要素を引数として与えて評価し、その結果で比較します。ブロックは <=> 演算子と同様に整数を返すことが期待されています。つまり、ブロックは第1引数が大きいなら正の整数、両者が等しいなら0、そして第1引数の方が小さいなら負の整数を返さなければいけません。両者を比較できない時は nil を返します。

    kiyo_hiko
    kiyo_hiko 2015/11/11
    宇宙船演算子でソートする
  • Array#filter (Ruby 3.3 リファレンスマニュアル)

    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!

    kiyo_hiko
    kiyo_hiko 2015/11/11
    remove-if-notとかfilter的な // even_upto_10 = 1.upto(10).select { |n| n % 2 == 0 }
  • Hash#keys (Ruby 3.3 リファレンスマニュアル)

    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

    kiyo_hiko
    kiyo_hiko 2015/11/11
    mをマップのインスタンスとすると、m.keys
  • Array to Hash Ruby

    Convert this Array: a = ["item 1", "item 2", "item 3", "item 4"] ...to a Hash: { "item 1" => "item 2", "item 3" => "item 4" } i.e. elements at even indexes are keys and odd ones are values.

    Array to Hash Ruby
    kiyo_hiko
    kiyo_hiko 2015/10/20
    通常はflattenしてHash[*flat_array]、2.1.0以降to_hが使えるので2次元な[[a,b],[c,d],...].to_hでハッシュ化できる。2次元化するなら1.upto(100).each_slice(2)的にやる
  • ビットフィールド - Wikipedia

    ビットフィールド (英: bit field) は、プログラミングにおいてブーリアン型のフラグをコンパクトなビットの並びとして格納する手法である。ビットフィールドの格納には、整数型を使用する。個々のフラグは、ビット単位で格納される。通常は、ソースコードで、個別のビットがフラグに対応する意味を付けられた、2の冪乗の定数が定義される。ビット演算の論理積・論理和・否定の組み合わせが、フラグのセット・リセットとテストを行うために使われる。 ビットフィールドはビット配列(英語版)とは異なる。ビット配列は、整数でインデックスを付けられた大きなビットの集合を保存するために使用され、コンピュータ言語でサポートされる整数型よりも大きいことがある。一方、ビットフィールドは典型的にはワードサイズの範囲内であり、各ビットを参照する表記法は数値によるインデックスから独立している。ただし、ビットフィールドを用いるより

    kiyo_hiko
    kiyo_hiko 2015/10/15
    ビットフラグ呼ばわりしていたが、一般的にはビットフィールドと言うっぽい
  • Hash#merge (Ruby 3.3 リファレンスマニュアル)

    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

    kiyo_hiko
    kiyo_hiko 2015/10/14
    a.merge b # => new hash、merge! => 破壊されたa。aとbで同じキーがあればbで上書きされる
  • JavaでもC#みたいなオブジェクト初期化子書けるんですよ - C Sharpens you up

    コンストラクタが特に何もしてくれず、インスタンス作ってから初期化しないといけないタイプのクラスってありますよね。シリアライズのためだったり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"

    JavaでもC#みたいなオブジェクト初期化子書けるんですよ - C Sharpens you up
  • GS-Collections-by-Example-1

    昨年のjClarityのインタビューで、GS Collectionsを便利に使ういくつかの機能の組み合わせを紹介しました。元記事はこちらから読むことができます。 Java 8がリリースされ、Stream APIが提供されている今となっては、なぜGS Collectionsを使う必要があるのか疑問に思うかもしれません。Stream APIJavaコレクションフレームワークにとって大きな前進ではありますが、必要な機能がすべて実装されているわけではありません。上の表にもあるように、GS CollectionsではMultimapやBag、イミュータブルなコンテナ、プリミティブ型専用のコンテナなどが提供されています。HashSetやHashMapをより最適化した代替実装や、それらの利点を生かしたBagやMultimapの実装などもあります。GS Collectionsのイテレーションパターンはコ

    GS-Collections-by-Example-1
  • [Java] Java5とJava1.4の夢のコラボレーション-ウンコード・マニア

    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

    kiyo_hiko
    kiyo_hiko 2014/05/07
    これならデータが固まってればPair<K,V>作ってList<Pair<K,V>>にするし、変更可能性のあるデータならデータのクラスを書いてしまうなあ。
  • 配列の要素に特定の値が含まれているかチェックする方法 - Java 入門

    配列の要素としてある特定の値が含まれているかどうか、チェックしたい場合にどうしたらよいか説明します。 例えば "カレー", "ラーメン", "ハンバーグ" という三つの文字列の要素を値として持っている配列があった時に、 その中に "ホットドッグ" があるかどうかチェックする場合です。この場合は存在しないので false を返すことを考えます。 "ラーメン" があるかどうか、といえば、"ラーメン" は要素に含まれるので true を返す、というような場合です。 配列の操作のための java.util.Arrays クラス さて 「要素の中に特定の値を含むかどうか」 というチェックといえば、コレクションの contains メソッドがあります。 contains メソッドはまさに今ここで望んでいる動作をします。 しかしながら、あいにく配列では contains メソッドがありません。 では、ど

    配列の要素に特定の値が含まれているかチェックする方法 - Java 入門
    kiyo_hiko
    kiyo_hiko 2013/09/24
    ふつうにArrays.asListでいいのか。
  • ConcurrentModificationExceptionのスマートな回避方法 - OKWAVE

    次のコードのように反復中にそのコレクションを削除しようとすると、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

    ConcurrentModificationExceptionのスマートな回避方法 - OKWAVE
    kiyo_hiko
    kiyo_hiko 2013/09/16
    別に並行処理のつもりでなくても"Concurrent~"がでてビビる for-eachでフィルタリングできないよというのはたしかJavaチュートリアル第4版で読んだ気が。忘れてた → 見直したらIteratorのremoveが唯一安全と書いてあった