数量vs长度vs尺寸


167

通过使用多种编程语言和库,我注意到用于集合中元素总数的各种术语。

最常见的似乎是lengthcountsize

例如。

array.length
vector.size()
collection.count

有没有首选的用语?它取决于收集的类型吗?即。可变/不变

是否首选将其作为属性而不是方法?


List.CapacityC#中也有属性。
RBT

我希望新的语言能够避免使用歧义的术语。
Nikolay Klimchuk

Answers:


231

Length() 倾向于引用连续的元素-例如,字符串的长度。

Count() 往往是指较宽松的集合中的元素数量。

Size() 往往是指集合的大小,在矢量(或字符串)等情况下,长度通常可能与长度不同,字符串中可能有10个字符,但保留了20个字符。元素-检查源/文档。

Capacity()-用于专门指代集合中分配的空间,而不是其中的有效元素数量。如果类型同时定义了“容量”和“大小”,则“大小”通常是指实际元素的数量。

我认为重点在于人类语言和习惯用语,字符串的大小似乎不太明显,而集合的长度同样令人困惑,即使它们可能用于指代同一事物(元素数量) )中的数据。


5
那么什么是“宽松集合”?我没有在这里看到大小和计数之间的差异。
苏菲·阿尔珀特

32
@ben:大小=可用插槽,数量=实际元素。size ==收集已满时计数。
史蒂文·埃弗斯

8
Downvoting因为size()是指元素的向量的数量,capacity()......至少在C ++中,我认为是始发vectors的size秒。
戴夫·亚伯拉罕斯

10
@DaveAbrahams-我从来没有说过这种情况。再读一遍。我说这是“倾向于参考”,我什至从未尝试过做出一种特定的声明,该声明同样适用于所有语言的所有集合类的所有排列。
gbjbaanb

2
@SnOrfus我认为您已经进入了“容量”领域。std::vector例如(C ++)使用“容量”和“大小”,而分别使用“大小”和“计数”。其实,一切都std::使用“大小”为当前元素计数,甚至std::string(它提供了模板的兼容性和完全相同的“长度”为......人们方便我猜“大小”)。
杰森C

28

FWIW(几乎消失了),我更喜欢使用“ Count”,因为它似乎表明它将毫无疑问地返回集合中的元素/项目数。

当面对“长度”或“大小”这两个术语时,我常常想知道(或者甚至被迫重新阅读文档)片刻的东西是否会告诉我集合中有多少个元素或如何集合消耗的字节数。对于打算像数组或字符串这样的单调的集合尤其如此。

但是没有人负责Java,BCL / .Net或C / C ++标准框架/库所使用的命名约定,因此没有人问我,所以您都被它们提出的任何东西所困扰。

如果只有我比我聪明得多,并被任命为比耶恩(Bjarne),你们所有人都可以免于痛苦。

当然,回到现实世界中,您应该尝试使用所使用的语言/平台(例如,size()在C ++中)使用的任何命名约定。这似乎并不能帮助您解决Array.Length困境。


16
虽然“长度”和“大小”是名词,但“计数”也是一个动词,因此可以将其解释为在运行时计数(O(n))与查找值(O(1))。
mbx 2012年

确实,这就是在LINQ中使用的方式:Enumerable.Count
Edward Brey

11

这些术语在某种程度上是可以互换的,尽管在某些情况下,我更喜欢一个术语。通常,如果您考虑如何将这个元素的长度/大小/数量以口头形式描述给另一个人,您将获得最佳使用效果

length()表示元素具有长度。字符串有长度。您说“一个字符串长20个字符”,对吗?所以它有长度。

size()表示元素具有大小。例如,文件具有大小。您说“此文件的大小为2 MB”,对吗?所以它有一个大小。

也就是说,字符串也可以具有大小,但是我希望这里还有其他内容。例如,UTF-16字符串的长度可能为100个字符,但是由于每个字符都由两个字节组成,因此我希望大小为200。

count()非常不寻常 Objective-C使用count作为数组中元素的数量。有人可能会争辩说数组是有长度的(如Java),有大小的(如大多数其他语言)还是有计数。但是,大小可能再次是字节大小(如果数组项是32位int,每个项是4字节)和长度……我不会说“数组长20个元素”,这听起来有点奇怪我。我会说“一个数组有20个元素”。我不确定count是否可以很好地表达出来,但是我认为count在这里是它的简写形式,elementCount()对于数组来说,它比length()或size()更有意义。

如果您使用编程语言创建自己的对象/元素,则最好使用其他类似元素,因为程序员习惯于使用该术语来访问所需的属性。


按照字符串的类比,文件必须具有length,但是不同的存储可能使用不同sizes的存储其数据。Java在java.io.File#length()中也这样认为,但似乎世界其他地方都意见不同。
伊万·巴拉索夫

1
@IvanBalashov我在日常谈话中从未使用过“文件长度”,对我来说,文件没有长度而是大小,这也是我在回复中写的。每当我们谈论原始字节时,我们都在谈论大小恕我直言,没有更具体内容的文件只是一堆字节。长度通常不是用来表示字节数,而是用来表示字符串在一起的累积(字节对我来说不是元素,更多的是构成元素的构建块,它们也不是“字符串”)。
梅基'17

4

如果您要查找集合中的项目数,我认为计数是最明显的用词。对于尚未特别喜欢某种给定语言的新程序员,这甚至应该是显而易见的。

它应该是一个属性,因为它就是它的性质:集合的描述(又称属性)。一种方法意味着它必须对集合做一些事情才能获得项目数,这似乎并不直观。


3

嗯...我不会用大小。因为这可能与字节大小混淆。长度-对于数组,只要它们应该使用随后的内存字节,就可能有意义。虽然...长度...在什么地方?计数很清楚。多少个元素。我会用计数。

关于属性/方法,我将使用属性来标记它的速度快,并使用方法来标记它的速度慢。

而且,最重要的是-我会坚持您所使用的语言/库的标准。


那么,只有一堆字节的DataBlock呢?它有长度还是有尺寸?
梅基

2

添加到@gbjbaanb的答案...

如果“属性”暗示对值的公共访问,那么我想说“方法”仅是提供封装和隐藏实现的首选。

您可能会改变关于如何使用count元素或如何维护元素的想法count。如果它是一个属性,那么您将陷入困境-如果通过一种方法来访问它,则可以更改基础实现,而不会影响集合的用户。


如果将其暴露为财产,您为什么会“卡住”?属性具有一个底层实现,可以在不破坏接口的情况下轻松地进行更改。实际上,大多数语言无论如何都将属性实现为编译器生成的get / set方法……您只是不能直接调用它们。
Scott Dorman

您指的是“大多数语言”?C,C ++,Java(仅举几例)不这样做。我知道Ruby和Groovy。请注意我也是如何开始回答的:“如果'财产'意味着……”为什么会停滞不前?如果班级的界面发生变化,则客户必须更改(通常而言)
Ken Gentle,

1

实际上,在Elixir中,存在跨语言类型与之相关的明确命名方案。

当“计算”数据结构中的元素数量时,Elixir还遵循一个简单的规则:size如果操作在恒定时间内(即,值是预先计算的)或length操作是线性的(即,计算的), 则为函数命名长度随着输入的增长而变慢)。


0

对我来说,这有点像问“ foreach”是否比“ for each”更好。它仅取决于语言/框架。


而且,这有什么关系呢?有什么变化?我们所有人都会因为选择两个且前后不一致而向Java人士发送愤怒的电子邮件吗?
S.Lott

1
这就是我的意思。为什么想知道哪个更好。就是这样。
EBGreen

0

我要说的是,这取决于您使用的特定语言。例如,在c#中,如果您使用数组,则具有属性长度;如果从IEnumerable继承而来,则具有扩展方法 Count(),但这并不快。而且,如果您从ICollection继承,则拥有属性计数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.