Anzahl gegen Länge gegen Größe in einer Sammlung

167

Durch die Verwendung einer Reihe von Programmiersprachen und Bibliotheken sind mir verschiedene Begriffe aufgefallen, die für die Gesamtzahl der Elemente in einer Sammlung verwendet werden.

Die am häufigsten zu sein scheint length, countund size.

z.B.

array.length
vector.size()
collection.count

Gibt es einen bevorzugten Begriff? Kommt es darauf an, um welche Art von Sammlung es sich handelt? dh. veränderlich / unveränderlich

Gibt es eine Präferenz dafür, dass es eine Eigenschaft anstelle einer Methode ist?

Melasse
quelle
Und es gibt auch List.CapacityEigentum in C #.
RBT
Ich hoffe, dass neue Sprachen mehrdeutige Begriffe vermeiden.
Nikolay Klimchuk

Antworten:

231

Length() neigt dazu, sich auf zusammenhängende Elemente zu beziehen - eine Zeichenfolge hat beispielsweise eine Länge.

Count() bezieht sich in der Regel auf die Anzahl der Elemente in einer loseren Sammlung.

Size() In der Regel bezieht sich dies auf die Größe der Sammlung. In Fällen wie Vektoren (oder Zeichenfolgen) kann dies häufig von der Länge abweichen. Eine Zeichenfolge enthält möglicherweise 10 Zeichen, der Speicher ist jedoch für 20 reserviert. Sie kann sich auch auf die Anzahl der Zeichen beziehen Elemente - Quelle / Dokumentation prüfen.

Capacity()- Wird verwendet, um speziell auf den zugewiesenen Speicherplatz in der Sammlung und nicht auf die Anzahl der gültigen Elemente darin zu verweisen. Wenn für den Typ sowohl "Kapazität" als auch "Größe" definiert ist, bezieht sich "Größe" normalerweise auf die Anzahl der tatsächlichen Elemente.

Ich denke, der Hauptpunkt liegt in der menschlichen Sprache und den Redewendungen. Die Größe einer Zeichenfolge scheint nicht sehr offensichtlich zu sein, während die Länge eines Satzes ebenso verwirrend ist, obwohl sie möglicherweise verwendet werden, um sich auf dasselbe zu beziehen (Anzahl der Elemente) ) in einer Sammlung von Daten.

gbjbaanb
quelle
5
Was ist also eine "lockerere Sammlung"? Ich sehe hier keinen Unterschied zwischen Größe und Anzahl.
Sophie Alpert
32
@ben: Größe = verfügbare Slots, Anzahl = tatsächliche Elemente. size == count, wenn die Sammlung voll ist.
Steven Evers
8
Downvoting, weil size()sich auf die Anzahl der Elemente im Vektor bezieht, nicht auf seine capacity()… zumindest in C ++, das meiner Meinung nach der Urheber von vectors mit sizes ist.
Dave Abrahams
10
@ DaveAbrahams - Ich habe nie gesagt, dass dies der Fall ist. Lies es nochmals. Ich sagte, es "neigt dazu, sich zu beziehen", ich habe nie versucht, eine spezifische Aussage zu machen, die für alle Permutationen aller Sammlungsklassen in allen Sprachen gleichermaßen gilt.
Gbjbaanb
2
@ SnOrfus Ich denke, Sie sind dort in den Bereich der "Kapazität" gegangen. std::vector(C ++) verwendet beispielsweise "Kapazität" und "Größe", wobei Sie "Größe" bzw. "Anzahl" verwenden. Tatsächlich verwendet alles in std::"Größe" für die aktuelle Elementanzahl, sogar std::string(was "Größe" für Vorlagenkompatibilität und eine völlig identische "Länge" für ... menschliche Bequemlichkeit bietet, denke ich).
Jason C
28

FWIW (und das ist so gut wie nichts), ich bevorzuge 'Count', weil es darauf hindeutet, dass die Anzahl der Elemente / Elemente in der Sammlung ziemlich eindeutig zurückgegeben wird.

Wenn ich mit den Begriffen "Länge" oder "Größe" konfrontiert werde, frage ich mich oft für einen Moment (oder bin sogar gezwungen, die Dokumentation erneut zu lesen), ob das verdammte Ding mir sagen wird, wie viele Elemente sich in der Sammlung befinden oder wie viele Bytes, die die Sammlung verbraucht. Dies gilt insbesondere für Sammlungen, die wie Arrays oder Strings anhänglich sein sollen.

Aber niemand, der für die Namenskonventionen verantwortlich war, die von den Java-, BCL / .Net- oder C / C ++ - Standard-Frameworks / -Bibliotheken verwendet wurden, hat sich die Mühe gemacht, mich zu fragen.

Wenn ich nur viel schlauer wäre als ich und Bjarne heißen würde, könnte euch allen das Elend erspart bleiben ...

Natürlich sollten Sie in der realen Welt versuchen, sich an die Namenskonvention zu halten, die von der von Ihnen verwendeten Sprache / Plattform verwendet wird (z. B. size()in C ++). Nicht, dass Ihnen dies bei Ihrem Array.LengthDilemma zu helfen scheint .

Michael Burr
quelle
16
Während Länge und Größe Substantive sind, ist Count auch ein Verb, daher könnte es so interpretiert werden, dass es zur Laufzeit (O (n)) gegen einen Wert (O (1)) zählt.
mbx
Genau so wird es in LINQ: Enumerable.Count
Edward Brey
11

Die Begriffe sind etwas austauschbar, obwohl ich in einigen Situationen einander vorziehen würde. Normalerweise können Sie die beste Verwendung erzielen, wenn Sie darüber nachdenken, wie Sie die Länge / Größe / Anzahl dieses Elements einer anderen Person mündlich beschreiben würden.

length()impliziert, dass das Element eine Länge hat. Eine Zeichenfolge hat eine Länge. Sie sagen "eine Zeichenfolge ist 20 Zeichen lang", richtig? Es hat also eine Länge.

size()impliziert, dass das Element eine Größe hat. ZB hat eine Datei eine Größe. Sie sagen "diese Datei hat eine Größe von 2 MB", richtig? Es hat also eine Größe.

Das heißt, eine Zeichenfolge kann auch eine Größe haben, aber ich würde hier etwas anderes erwarten. Beispielsweise kann eine UTF-16-Zeichenfolge eine Länge von 100 Zeichen haben, aber da jedes Zeichen aus zwei Bytes besteht, würde ich eine Größe von 200 erwarten.

count()ist sehr ungewöhnlich. Objective-C verwendet count für die Anzahl der Elemente in einem Array. Man könnte argumentieren, ob ein Array eine Länge (wie in Java), eine Größe (wie in den meisten anderen Sprachen) oder eine Anzahl hat. Die Größe könnte jedoch wieder die Größe in Byte (wenn die Array-Elemente 32 Bit int sind, ist jedes Element 4 Byte) und die Länge sein ... Ich würde nicht sagen, dass "ein Array 20 Elemente lang ist", was ziemlich seltsam klingt mich. Ich würde sagen "ein Array hat 20 Elemente". Ich bin mir nicht sicher, ob count das sehr gut ausdrückt, aber ich denke, count ist hier eine Kurzform für elementCount()und das ist für ein Array wiederum viel sinnvoller als length () oder size ().

Wenn Sie eigene Objekte / Elemente in einer Programmiersprache erstellen, verwenden Sie am besten alle ähnlichen Elemente, da Programmierer es gewohnt sind, mit diesem Begriff auf die gewünschte Eigenschaft zuzugreifen.

Mecki
quelle
Gemäß Ihrer Zeichenfolgenanalogie muss eine Datei eine haben length, aber unterschiedliche Speicher verwenden möglicherweise unterschiedliche sizeszum Speichern ihrer Daten. Java glaubt das auch in java.io.File # length () , aber es scheint, als ob der Rest der Welt anderer Meinung ist.
Ivan Balashov
1
@IvanBalashov Ich habe im täglichen Gespräch nie "Dateilänge" verwendet, für mich hat eine Datei keine Länge, sondern eine Größe, und das habe ich auch in meiner Antwort geschrieben. Wann immer wir von rohen Bytes sprechen, sprechen wir IMHO von Größe und eine Datei ohne näheren spezifischen Inhalt ist nur ein Bündel von Bytes. Die Länge wird normalerweise nicht zum Ausdrücken der Byteanzahl verwendet, sondern zum Ausdrücken einer Ansammlung von miteinander verbundenen Elementen (Bytes sind für mich keine Elemente, eher die Bausteine ​​zur Bildung von Elementen und sie sind auch nicht "aneinandergereiht").
Mecki
4

Count ist meiner Meinung nach der naheliegendste Begriff, wenn Sie nach der Anzahl der Elemente in einer Sammlung suchen. Das sollte sogar neuen Programmierern klar sein, die sich noch nicht besonders an eine bestimmte Sprache gebunden haben.

Und es sollte eine Eigenschaft sein, wie es ist: eine Beschreibung (auch bekannt als Eigenschaft) der Sammlung. Eine Methode würde bedeuten, dass sie etwas mit der Sammlung tun muss, um die Anzahl der Elemente zu ermitteln, und das scheint einfach nicht intuitiv zu sein.

Corin
quelle
3

Hmm ... ich würde keine Größe verwenden. Weil dies mit der Größe in Bytes verwechselt werden kann. Länge - könnte für Arrays sinnvoll sein, solange sie konsequente Speicherbytes verwenden sollen. Obwohl ... Länge ... in was? Die Zählung ist klar. Wie viele Elemente. Ich würde count verwenden.

Über Eigenschaft / Methode würde ich Eigenschaft verwenden, um es schnell zu markieren, und Methode, um es langsam zu markieren.

Und das Wichtigste: Ich würde mich an die Standards der Sprachen / Bibliotheken halten, die Sie verwenden.

Paul Kapustin
quelle
Was ist also mit einem DataBlock, nur ein paar Bytes? Hat es eine Länge oder eine Größe?
Mecki
2

Hinzufügen zu @ gbjbaanbs Antwort ...

Wenn "Eigenschaft" den öffentlichen Zugriff auf den Wert impliziert, würde ich sagen, dass "Methode" bevorzugt wird, um lediglich die Kapselung bereitzustellen und die Implementierung zu verbergen.

Sie können Ihre Meinung darüber ändern, wie countElemente verwendet werden oder wie Sie dies beibehalten count. Wenn es sich um eine Eigenschaft handelt, stecken Sie fest. Wenn Sie über eine Methode darauf zugreifen, können Sie die zugrunde liegende Implementierung ändern, ohne die Benutzer der Sammlung zu beeinträchtigen.

Ken Gentle
quelle
Warum stecken Sie fest, wenn es als Eigentum ausgesetzt ist? Eigenschaften haben eine zugrunde liegende Implementierung, die sich genauso leicht ändern kann, ohne die Schnittstelle zu beschädigen. Tatsächlich implementieren die meisten Sprachen Eigenschaften sowieso als vom Compiler generierte get / set-Methoden ... Sie können sie einfach nicht direkt aufrufen.
Scott Dorman
Auf welche "meisten Sprachen" beziehen Sie sich? C, C ++, Java (um nur einige zu nennen) tun dies nicht. Ruby und Groovy, die ich kenne. Bitte beachten Sie auch, wie ich mit der Antwort angefangen habe: "Wenn 'Eigentum' impliziert ..." Warum stecken bleiben? Wenn sich die Schnittstelle zur Klasse ändert, müssen sich die Clients ändern (im Allgemeinen)
Ken Gentle
1

In Elixir gibt es tatsächlich ein klares Namensschema, das mit verschiedenen Typen in der Sprache verknüpft ist.

Beim „Zählen“ der Anzahl von Elementen in einer Datenstruktur hält sich Elixir auch an eine einfache Regel: Die Funktion wird benannt, sizewenn sich die Operation in konstanter Zeit befindet (dh der Wert ist vorberechnet) oder lengthwenn die Operation linear ist (dh berechnet wird) Die Länge wird langsamer, wenn die Eingabe wächst.

Brightball
quelle
0

Für mich ist das ein bisschen so, als würde man fragen, ob "foreach" besser ist als "für jeden". Es kommt nur auf die Sprache / den Rahmen an.

EBGreen
quelle
Und was macht es aus? Was ändert sich? Werden wir alle wütende E-Mails an die Java-Leute schreiben, weil sie zwei ausgewählt haben und inkonsistent sind?
S.Lott
1
Das ist mein Punkt. Warum sich fragen, was besser ist? Es ist was es ist.
EBGreen
0

Ich würde sagen, dass es von einer bestimmten Sprache und Klassen abhängt . Wenn Sie beispielsweise in c # Array verwenden, haben Sie die Eigenschaftslänge . Wenn Sie etwas haben, das von IEnumerable erbt, haben Sie die Erweiterung Method Count (), die jedoch nicht schnell ist. Und wenn Sie von ICollection geerbt haben, haben Sie Property Count.

Alexandr
quelle