191

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

最常见的似乎是length,countsize

例如。

array.length
vector.size()
collection.count

有什么首选的术语可以使用吗?这取决于它是什么类型的集合?IE。可变/不可变

是否倾向于将其作为属性而不是方法?

4

10 回答 10

256

Length()往往指的是连续的元素——例如,一个字符串有一个长度。

Count()倾向于指较松散集合中的元素数量。

Size()倾向于指集合的大小,通常这可能与向量(或字符串)等情况下的长度不同,一个字符串中可能有 10 个字符,但存储空间保留为 20 个。它也可能指的是元素 - 检查源/文档。

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

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

于 2008-11-18T23:25:04.180 回答
30

FWIW(这几乎没有),我更喜欢“计数”,因为它似乎表明它将非常明确地返回集合中元素/项目的数量。

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

但是,负责 Java、BCL/.Net 或 C/C++ 标准框架/库所使用的命名约定的人都懒得问我,所以你们都被他们提出的任何问题所困扰。

如果我比我聪明得多并被命名为 Bjarne,你们所有人都可以免于痛苦......

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

于 2009-10-01T23:43:21.697 回答
13

这些术语在某种程度上可以互换,尽管在某些情况下我更喜欢其中一个。通常,如果您考虑如何向其他人口头描述此元素的长度/大小/计数,通常可以获得最佳用法?

length()意味着元素有长度。字符串有长度。你说“一个字符串有 20 个字符长”,对吧?所以它有一个长度。

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

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

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

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

于 2008-11-19T00:14:00.510 回答
4

如果您要查找集合中的项目数,我认为计数是最明显的术语。对于还没有特别依赖于特定语言的新程序员来说,这甚至应该是显而易见的。

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

于 2008-11-18T23:24:11.297 回答
3

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

关于属性/方法,我会使用属性来标记它是快的,而方法来标记它是慢的。

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

于 2008-11-18T23:23:03.093 回答
2

添加到@gbjbaanb的答案...

如果“属性”意味着对值的公共访问,我会说“方法”只是为了提供封装和隐藏实现而更受欢迎。

你可能会改变你对如何count元素或如何维护它的想法count。如果它是一个属性,你就会被卡住——如果它是通过一种方法访问的,你可以在不影响集合用户的情况下更改底层实现。

于 2008-11-18T23:29:31.007 回答
1

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

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

于 2016-06-14T13:41:49.180 回答
0

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

于 2008-11-18T23:21:37.090 回答
0

我会说这取决于您使用的特定语言和。例如,在 c# 中,如果您使用的是 Array,则您有Property Length,如果您有从 IEnumerable 继承的东西,则您有扩展Method Count(),但它并不快。如果您从 ICollection 继承,您将拥有Property Count。

于 2015-12-02T11:16:05.480 回答
0

科特林回答

来自_Collections.kt

/**
 * Returns the number of elements in this collection.
 */
@kotlin.internal.InlineOnly
public inline fun <T> Collection<T>.count(): Int {
    return size
}
于 2021-04-15T13:32:22.277 回答