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


167

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

最も一般的なのは、ように見えるlengthcountsize

例えば。

array.length
vector.size()
collection.count

使用すべき好ましい用語はありますか?コレクションの種類によって異なりますか?すなわち。可変/不変

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


またList.Capacity、C#にもプロパティがあります。
RBT 2017

新しい言語があいまいな用語を避けるように願っています。
Nikolay Klimchuk 2017年

回答:


231

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

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

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

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

主なポイントは人間の言語とイディオムにあると思いますが、文字列のサイズはそれほど明白ではないように見えますが、セットの長さは同じもの(要素の数) )データのコレクション内。


5
では、「ゆるいコレクション」とは何でしょうか。ここではサイズとカウントの違いはわかりません。
ソフィーアルパート

32
@ben:サイズ=使用可能なスロット、カウント=実際の要素。サイズ==コレクションがいっぱいになったときのカウント。
Steven Evers、

8
のでDownvoting size()ベクトルの要素の数を意味しないそのcapacity()私はの創始者だと思う...少なくともC ++で、vectorと秒size秒。
デイブアブラハム2013年

10
@DaveAbrahams-私はそれが事実だと言ったことはありません。もう一度読んでください。私はそれを「参照する傾向がある」と言ったが、私はすべての言語のすべてのコレクションクラスのすべての順列に等しく適用される特定のステートメントを作成しようとさえしなかった。
gbjbaanb 2013年

2
@SnOrfus「容量」の領域に入ったと思います。std::vector(C ++)たとえば、「容量」と「サイズ」を使用し、それぞれ「サイズ」と「カウント」を使用します。実際には、すべてstd::現在の要素数に「サイズ」を使用してstd::stringいます(テンプレートの互換性のために「サイズ」を提供し、人間の利便性のために完全に同一の「長さ」を提供します)。
Jason C

28

FWIW(そしてそれはほとんど何もないことに近い)、私は 'Count'を好む。というのは、コレクション内の要素/項目の数をかなり明確に返すことを示しているようだからです。

「長さ」または「サイズ」という用語に直面すると、コレクションに含まれている要素の数やその方法が何であるかを教えてくれるのかどうか、ちょっと疑問に思うことがよくあります(またはドキュメントの再読を強いられます)。コレクションが消費しているバイト数。これは、配列や文字列のように偶然であることが意図されているコレクションに特に当てはまります。

しかし、Java、BCL / .Net、またはC / C ++の標準フレームワーク/ライブラリで使用されている命名規則に責任を負う人は誰も私に尋ねる必要はありませんでした。

私だけが私よりもずっと賢く、Bjarneと名付けられたとしたら、皆さん全員が悲惨さを免れるかもしれません...

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


16
長さとサイズは名詞ですが、カウントも動詞であるため、実行時にカウントする(O(n))と値をルックアップする(O(1))と解釈できます。
mbx 2012年

確かに、それはそれはLINQで使用しています正確にどのようだ:Enumerable.Count
エドワード・ブレイ

11

これらの用語は多少互換性がありますが、状況によっては、どちらか一方を優先する場合があります。通常、この要素の長さ/サイズ/数を他の人に口頭でどのように説明するかについて考えれば、最高の使用法を得ることができますか?

length()要素が長さを持つことを意味します。文字列には長さがあります。あなたは「文字列は20文字の長さです」と言いますよね?だから長さがあります。

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

とはいえ、文字列にもサイズを設定できますが、ここでは別のものが期待されます。たとえば、UTF-16文字列の長さは100文字ですが、すべての文字は2バイトで構成されているため、サイズは200になるはずです。

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

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


文字列の類推に従って、ファイルにはが必要ですが、lengthストレージが異なれsizesば、そのデータを格納するために異なるものを使用する場合があります。Javaもjava.io.File#length()でそのように考えていますが、他の国々は同意していないようです。
Ivan Balashov

1
@IvanBalashov私は毎日の会話で「ファイルの長さ」を使用したことはありません。私にはファイルには長さはありませんがサイズがあり、それも返信に書いたものです。生のバイトについて話しているときはいつでも、サイズがIMHOであり、より具体的なコンテンツのないファイルは単なるバイトの集まりです。長さは通常、バイト数の表現には使用されませんが、一緒にストリング化された要素の累積を表現するために使用されます(バイトは私にとって要素ではなく、要素を形成するためのビルディングブロックであり、「ストリング化」されていません)。
メッキー

4

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

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


3

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

プロパティ/メソッドについて、私はプロパティを使用して高速であることをマークし、メソッドを使用して低速であることをマークします。

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


では、DataBlockについてはどうでしょうか。長さやサイズはありますか?
メッキ

2

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

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

どのようにcount要素を管理するか、それをどのように維持するかについて気が変わるかもしれませんcount。プロパティの場合、行き詰まっています。メソッドを介してアクセスする場合は、コレクションのユーザーに影響を与えることなく、基盤となる実装を変更できます。


プロパティとして公開されている場合、なぜ「行き詰まっている」のですか?プロパティには、インターフェイスを壊すことなく簡単に変更できる基本的な実装があります。実際、ほとんどの言語は、とにかくコンパイラが生成したget / setメソッドとしてプロパティを実装しています。直接呼び出すことはできません。
スコットドーマン

どの「ほとんどの言語」を参照していますか?C、C ++、Java(ほんの数例を挙げると)はこれを行わないでください。RubyとGroovyは知っています。私が答えを始めた方法にも注意してください:「「プロパティ」が意味する場合...」なぜ行き詰まったのですか?クラスへのインターフェースが変更された場合、クライアントは(一般的に言えば)変更する必要があります
Ken Gentle

1

エリクサーには、言語のさまざまなタイプに関連付けられた明確な命名方式があります。

データ構造内の要素の数を「数える」とき、Elixirも単純な規則に従います。size操作が一定時間内にある場合(つまり、値が事前計算されている場合)、または length操作が線形である場合(つまり、計算中)入力が大きくなるにつれて、長さが遅くなります)。


0

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


そして、それは何が重要ですか?何が変わりますか?私たちは全員、Javaの人々に怒りの電子メールを書いて、2つを選んで一貫性がないと言っているのでしょうか。
S.Lott、2008年

1
それが私のポイントです。なぜどちらが良いのか疑問に思う。それが現実さ。
EBGreen 2008年

0

それはあなたが使っている特定の言語クラスに依存すると私は言うでしょう。たとえばc#では、配列を使用している場合はプロパティの長さ、IEnumerableから継承するものがある場合は拡張メソッド Count()がありますが、高速ではありません。ICollectionから継承した場合は、プロパティカウントがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.