web-dev-qa-db-ja.com

コレクションのカウントvs長さvsサイズ

多数のプログラミング言語とライブラリを使用することで、コレクション内の要素の総数に使用されるさまざまな用語に気付きました。

最も一般的なものは、lengthcount、およびsizeです。

例えば。

array.length
vector.size()
collection.count

使用する優先語はありますか?コレクションのタイプに依存しますか?すなわち。可変/不変

メソッドではなくプロパティであるという設定はありますか?

157
molasses

Length()は、連続する要素を参照する傾向があります。たとえば、文字列には長さがあります。

Count()は、より緩やかなコレクションの要素の数を参照する傾向があります。

Size()はコレクションのサイズを参照する傾向があり、多くの場合、これはベクトル(または文字列)などの場合の長さと異なる場合があります。文字列には10文字がありますが、ストレージは20に予約されています。要素の数を参照する場合があります-ソース/ドキュメントを確認してください。

Capacity()-コレクション内の有効な要素の数ではなく、コレクション内の割り当てられたスペースを特に参照するために使用されます。タイプに「容量」と「サイズ」の両方が定義されている場合、「サイズ」は通常、実際の要素の数を指します。

主なポイントは人間の言語とイディオムにあると思いますが、文字列のサイズはあまり明白ではないようですが、セットの長さは同じものを参照するために使用されるかもしれませんが(要素の数)データのコレクション内。

220
gbjbaanb

FWIW(そして、それはほとんどゼロに近い)、私は 'Count'を好みます。これは、コレクション内の要素/アイテムの数をかなり明白に返すことを示すようだからです。

「長さ」または「サイズ」という用語に直面したとき、私はしばしば、いまいましい事がコレクションにいくつの要素があるか、またはどのように教えてくれるのかをしばらくの間疑問に思うようになりますコレクションが消費している多くのバイト。これは、配列または文字列のように偶発的であることが意図されているコレクションに特に当てはまります。

しかし、Java、BCL/.Net、またはC/C++標準フレームワーク/ライブラリで使用されている命名規則を担当する人は誰も私に尋ねる気にならなかったので、あなたはすべて彼らが思いついたものにこだわっています。

もし私が私よりはるかに賢く、Bjarneという名前だったら、あなた方全員が悲惨さを免れるかもしれません...

もちろん、現実の世界に戻って、使用している言語/プラットフォームで使用されている命名規則(たとえば、C++のsize())に固執するようにしてください。これがあなたのArray.Lengthジレンマに役立つようではないということではありません。

27
Michael Burr

いくつかの状況では別の用語を好むかもしれませんが、用語は多少交換可能です。通常、この要素の長さ/サイズ/数を他の人に口頭でどのように説明しますか?について考えると、最適な使用法を得ることができます。

length()は、要素に長さがあることを意味します。文字列には長さがあります。 「文字列の長さは20文字」と言いますよね?そのため、長さがあります。

size()は、要素にサイズがあることを意味します。例えば。ファイルにはサイズがあります。 「このファイルのサイズは2 MBです」と言いますか?だから、サイズがあります。

とは言っても、文字列にはサイズを指定することもできますが、ここでは何か他のものを期待しています。例えば。 UTF-16ストリングの長さは100文字ですが、すべての文字が2バイトで構成されているため、サイズは200になると予想されます。

count()は非常に珍しいです。 Objective-Cは、配列内の要素の数にcountを使用します。配列の長さ(Javaのように)、サイズ(他のほとんどの言語のように)、またはカウントがあるかどうかを議論するかもしれません。ただし、サイズは再びバイト単位のサイズ(配列項目が32ビット整数の場合、各項目は4バイト)と長さです。「配列は20要素の長さ」とは言いません。私。 「配列には20個の要素があります」と言います。 countがそれを非常にうまく表現しているかどうかはわかりませんが、ここではcountはelementCount()の短縮形であり、長さ()やsize()よりも配列にとっても意味があると思います。

プログラミング言語で独自のオブジェクト/要素を作成する場合、プログラマーはその用語を使用して目的のプロパティにアクセスするため、他の同様の要素が使用するものを使用するのが最適です。

10
Mecki

カウントは、コレクション内のアイテムの数を探している場合に使用する最も明白な用語だと思います。これは、特定の言語にまだ特別な愛着を抱いていない新しいプログラマーにとっても明らかです。

そして、それはプロパティである必要があります。それは、コレクションの説明(プロパティ)です。メソッドは、アイテムの数を取得するためにコレクションに対して何かをする必要があることを意味し、それは単に直感的ではないように思われます。

4
Corin

うーん...サイズは使いません。これは、バイト単位のサイズと混同される可能性があるためです。長さ-配列が後続のバイトのメモリを使用することになっている限り、配列には意味があります。でも...長さ...何で?カウントは明確です。要素の数。カウントを使用します。

プロパティ/メソッドについては、プロパティを使用してそれを高速にマークし、メソッドを使用してそれを低速にマークします。

そして、最も重要なこと-あなたが使用している言語/ライブラリの標準に固執します。

3
badbadboy

@gbjbaanbの回答に追加しています...

「プロパティ」が値へのパブリックアクセスを意味する場合、「メソッド」は単にカプセル化を提供し、実装を隠すために優先されると言います。

count要素の方法や、そのcountの保守方法について気が変わるかもしれません。プロパティである場合、スタックしています。メソッドを介してアクセスする場合、コレクションのユーザーに影響を与えることなく、基になる実装を変更できます。

2
Ken Gentle

Elixirには、実際には言語のタイプ全体で明確な命名スキームが関連付けられています。

データ構造内の要素の数を「数える」場合、Elixirは単純なルールも順守します。関数の名前は、操作が一定時間(つまり、値が事前に計算される)の場合はsize、操作が線形の場合はlengthつまり、入力が大きくなると長さの計算が遅くなります)。

1
brightball

特定のlanguageを使用していることとclassesに依存していると思います。たとえば、c#で配列を使用している場合はプロパティ長さ、IEnumerableから継承するものがある場合は拡張機能メソッド Count()がありますが、高速ではありません。また、ICollectionから継承した場合、Property Countになります。

0
Alexandr

私にとって、これは「foreach」の方が「for each」よりも優れているかどうかを尋ねるようなものです。言語/フレームワークに依存します。

0
EBGreen