计数与集合中的长度与大小

时间:2008-11-18 23:18:33

标签: collections naming-conventions terminology semantics

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

最常见的似乎是lengthcountsize

例如

array.length
vector.size()
collection.count

是否有任何首选术语? 它取决于它是什么类型的集合?即。可变/不可变

是否偏好它是属性而不是方法?

10 个答案:

答案 0 :(得分:218)

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

Count()倾向于引用宽松集合中的元素数量。

Size()倾向于引用集合的大小,通常这可能与向量(或字符串)之类的长度不同,字符串中可能有10个字符,但存储保留为20它也可能涉及元素数量 - 检查来源/文档。

Capacity() - 用于专门引用集合中的已分配空间,而不是其中的有效元素数。如果type同时定义了“capacity”和“size”,那么“size”通常指的是实际元素的数量。

我认为主要的观点是人类语言和习语,字符串的大小看起来并不是很明显,而集合的长度同样令人困惑,即使它们可能用于指代相同的东西(数据集合中的元素数量。

答案 1 :(得分:26)

FWIW(而且几乎没有任何东西),我更喜欢'Count',因为它似乎表明它将非常明确地返回集合中元素/项目的数量。

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

但是,没有人负责Java,BCL / .Net或C / C ++标准框架/库所使用的命名约定,这些都很困扰我,所以你们都会遇到他们提出的任何问题。< / p>

如果只有我比我更聪明并且被命名为Bjarne,你们所有人都可能幸免于难......

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

答案 2 :(得分:10)

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

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

size()表示该元素具有大小。例如。一个文件有一个大小。你说“这个文件大小为2 MB”,对吧?所以它有一个大小。

也就是说,一个字符串也可以有一个大小,但我希望在这里有别的东西。例如。一个UTF-16字符串可能有100个字符的长度,但由于每个字符由两个字节组成,我希望大小为200。

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

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

答案 3 :(得分:4)

我认为,如果您正在寻找集合中的项目数,我认为这是最明显的术语。对于那些尚未特别依赖某种语言的新程序员来说,这一点应该是显而易见的。

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

答案 4 :(得分:3)

嗯......我不会用尺码。因为这可能与字节大小混淆。 长度 - 可以对数组有所帮助,只要它们应该使用后续的内存字节。 虽然......长度......在什么? 伯爵很清楚。有多少元素。我会用伯爵。

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

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

答案 5 :(得分:2)

添加到@ gbjbaanb的回答......

如果“property”意味着公众访问该值,我会说“方法”仅仅是提供封装和隐藏实现的首选。

您可能会想到如何count元素或如何维护count。如果它是一个属性,那么你就会陷入困境 - 如果它是通过一个方法获得的,你就可以改变底层实现,而不会影响该集合的用户。

答案 6 :(得分:1)

在Elixir中,实际上有一种与语言类型相关的明确命名方案。

  

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

答案 7 :(得分:0)

对我来说,这有点像询问“foreach”是否优于“for each”。它只取决于语言/框架。

答案 8 :(得分:0)

我会说这取决于您使用的特定语言。例如,在c#中,如果你使用的是数组,你有属性长度,如果你有从IEnumerable继承的东西你有扩展方法 Count(),但它不快。如果您从ICollection继承,则您拥有 Property Count。

答案 9 :(得分:0)

Kotlin 答案

来自_Collections.kt

/**
 * Returns the number of elements in this collection.
 */
@kotlin.internal.InlineOnly
public inline fun <T> Collection<T>.count(): Int {
    return size
}