2016-07-01 42 views
4

associative arraylength()関数を使用すると、配列内で使用されている「最大のインデックス」が返されます。したがって、整数でないキーがある場合、length()は配列内の実際の要素数を返しません。 (そしてこれは他の理由でも起こり得る)AutoHotkeyで連想配列の長さを調べるにはどうしたらいいですか?

連想配列の長さを見つけるのにもっと有効なバージョンのlength()がありますか?

または、実際に各要素を繰り返してカウントする必要がありますか?私はどのようにすべての可能なキーを事前に知っていなくてもそれをやるか分からない。

答えて

3

フラットな配列を持つ場合、Array.MaxIndex()はインデックス内で最大の整数を返します。しかし、AutoHotKeyは最初のインデックスが1ではない配列を持つことができるので、これは常にベストではないので、MaxIndex()は誤解を招く可能性があります。

さらに、オブジェクトがインデックスに文字列を含む可能性のある関連ハッシュテーブルの場合、MaxIndex()はnullを返します。

だから、おそらくそれを数えるのが最善でしょう。

DesiredDroids := object() 
DesiredDroids["C3P0"] := "Gold" 
DesiredDroids["R2D2"] := "Blue&White" 
count :=0 
for key, value in DesiredDroids 
    count++ 
MsgBox, % "We're looking for " . count . " droid" . (count=1 ? "" : "s") . "." 

出力オブジェクトのカウントを取得するための

We're looking for 2 droids. 
+0

短い方法、お2/3にコードの行保存: 'DesiredDroids.SetCapacity(0)' – errorseven

+0

動作しますが、オブジェクトのでしょう。 SetCapacity(0)も未使用領域を切り捨てます。あなたのオブジェクトが短期間で大きく成長したり収縮している場合は、パフォーマンスの問題やメモリの断片化が発生する可能性があります(参考文献[Lexikosの投稿の半分程度](https://autohotkey.com/board/topic/81609 -ahk-l-preferred-one-liner-to-empty-object-before-reuse /) –

関連する問題