通过使用许多编程语言和库,我注意到集合中元素总数所用的各种术语。
最常见的似乎是length、count和size。
如。
1 2 3
| array.length
vector.size()
collection.count |
有什么好用的术语吗?它是否取决于它是什么类型的集合?即可变/不变
是否首选它是属性而不是方法?
- C中也有List.Capacity属性。
- 我希望新语言能避免含糊不清的术语。
Length()倾向于指相邻的元素——例如,字符串有一个长度。
Count()倾向于指较宽松集合中的元素数。
Size()倾向于指集合的大小,通常这与向量(或字符串)等情况下的长度不同,一个字符串中可能有10个字符,但存储空间保留为20。也可参考元素数量-检查来源/文档。
Capacity()—专门指集合中分配的空间,而不是集合中有效元素的数量。如果类型同时定义了"容量"和"大小",那么"大小"通常是指实际元素的数量。
我认为重点在于人类语言和习语,字符串的大小似乎不太明显,而集合的长度同样令人困惑,即使它们可能被用来指代数据集合中的相同事物(元素数)。
- 那么什么是"更宽松的收藏"?我看不出这里的大小和计数有什么区别。
- @本:大小=可用插槽,计数=实际元素。大小=集合已满时的计数。
- @Snorfus,这仍然是正确的,但我指的是没有任何有意义的连续元素的集合,例如地图或字典。你不会说一个集合有10个元素的长度,其中有10个元素的计数。
- 因为size()是指向量中的元素数目,而不是它的EDOCX1,1……,至少在C++中,这是EDOCX1的2个来源的EDCOX1×3的起源。
- @戴夫亚伯拉罕-我从没说过是这样的。再读一遍。我说它"倾向于引用",我甚至从未尝试过做出一个同样适用于所有语言中所有集合类的所有排列的特定语句。
- 完全无关但有趣的是,一个数学集合的"长度"(或度量)肯定与它的"大小"(或集合中元素的数量)不同。示例:间隔[0,1]的"长度"为1,但"大小"为aleph_1。
- @我认为你已经进入了"能力"领域。例如,EDOCX1 4(C++)使用"容量"和"大小",分别使用"大小"和"计数"。实际上,std::中的所有内容都使用"大小"作为当前元素计数,甚至使用std::string作为模板兼容性的"大小"和完全相同的"长度"。我想是为了人的方便)。
- 那么,tcp packet size还是tcp packet length呢?
- @Hugo TCP数据包不是集合,但被称为离散实体。
- 所以,为了得到更多的可可,我应该做.numberOfElements()?P
fwiw(这几乎是零),我更喜欢"count",因为它似乎表明它将返回集合中元素/项目的数量,非常明确。
当面对术语"长度"或"大小"时,我常常会想一想(甚至被迫重新阅读文档),到底这该死的东西会告诉我该集合中有多少元素,或者该集合正在消耗多少字节。对于打算像数组或字符串那样连续的集合,这一点尤其适用。
但是,没有人负责Java、BCL/.NET或C/C++标准框架/库所使用的命名约定,而他们却懒得问我,所以你们都被他们所提出的任何东西所困扰。
如果我比我聪明得多,而且被命名为比亚恩,你们所有人也许都能免于痛苦…
当然,回到现实世界中,你应该坚持使用你所使用的语言/平台的任何命名约定(例如,C++中的EDCOX1,0)。这似乎并不能帮助你解决你的Array.Length困境。
- 虽然长度和大小是名词,但count也是动词,因此它可以解释为运行时计数(o(n))与查找值(o(1))。
- 事实上,这就是它在linq中的用法:可枚举。
虽然在某些情况下,我更喜欢一个术语而不是另一个。通常,如果您考虑如何将此元素的长度/大小/计数口头描述给其他人,那么您可以得到最佳的用法。.
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文件中也这样认为,但是似乎世界其他地方不同意。
- @伊万巴拉肖夫,我从来没有在日常谈话中使用"文件长度",对我来说,文件的长度只有一个大小,这也是我在回复中写的。每当我们谈论原始字节时,我们谈论的是大小imho,没有更接近特定内容的文件只是一堆字节。长度通常不用于表示字节数,而是表示串在一起的元素的累积(字节对我来说不是元素,更多的是构成元素的构建块,它们也不是"串在一起")。
如果您要查找集合中的项目数,我认为count是最明显的术语。对于那些还没有特别关注某一特定语言的新程序员来说,这甚至应该是显而易见的。
它应该是一个属性,因为它就是这样的:集合的描述(又称属性)。一个方法意味着它必须对集合做一些事情来获取项目的数量,而这似乎是不具有逻辑性的。
嗯……我不会用尺寸。因为这可能与字节大小混淆。长度-对于数组来说是有意义的,只要它们使用后续的内存字节。虽然…长度…在什么?计数已清除。有多少元素。我会用计数。
关于属性/方法,我将使用属性来标记它的速度,而方法来标记它的速度。
最重要的是,我会坚持你使用的语言/库的标准。
正在添加到@gbjbaanb的答案中…
如果"property"意味着对值的公共访问,我会说"method"更适合于提供封装和隐藏实现。
您可能会改变您对如何使用count元素或如何维护count元素的看法。如果它是一个属性,那么您就陷入了困境——如果它是通过一个方法访问的,那么您可以在不影响集合用户的情况下更改底层实现。
- 如果它作为一种财产暴露出来,你为什么会"卡住"?属性有一个底层实现,可以在不破坏接口的情况下轻松地进行更改。事实上,大多数语言都实现了编译器生成的get/set方法的属性…您不能直接调用它们。
- 你指的是什么"大多数语言"?C、C++、Java(只是举几个名字)不要这么做。Ruby和groovy我知道。请注意我是如何开始回答的:"如果‘属性’意味着……"为什么会卡住?如果类的接口改变了,客户机就必须改变(一般来说)
在elixir中,实际上有一个清晰的命名方案与语言中的不同类型相关。
When"counting" the number of elements in a data structure, Elixir
also abides by a simple rule: the function is named size if the
operation is in constant time (i.e. the value is pre-calculated) or
length if the operation is linear (i.e. calculating the length gets
slower as the input grows).
我想说,这取决于您使用的特定语言和类。例如,在C中,如果使用的是数组,则具有属性长度;如果具有从IEnumerable继承的内容,则具有扩展方法count(),但它并不快。如果您继承了ICollection,则具有属性计数。
对我来说,这有点像问"for each"是否比"for each"更好。它仅仅取决于语言/框架。
- 还有,有什么关系?什么变化?我们是否都要给JavaFrice写一封愤怒的电子邮件来挑选两个不一致的人?
- 这就是我的观点。为什么想知道哪一个更好。就是这样。