contar vs longitud vs tamaño en una colección

167

Al usar varios lenguajes de programación y bibliotecas, noté varios términos usados ​​para el número total de elementos en una colección.

El más común parece ser length, county size.

p.ej.

array.length
vector.size()
collection.count

¿Hay algún término preferido para ser utilizado? ¿Depende de qué tipo de colección es? es decir. mutable / inmutable

¿Existe alguna preferencia de que sea una propiedad en lugar de un método?

melaza
fuente
Y también hay List.Capacitypropiedades en C #.
RBT
Espero que los nuevos idiomas eviten términos ambiguos.
Nikolay Klimchuk

Respuestas:

231

Length() tiende a referirse a elementos contiguos: una cadena tiene una longitud, por ejemplo.

Count() tiende a referirse a la cantidad de elementos en una colección más flexible.

Size() tiende a referirse al tamaño de la colección, a menudo esto puede ser diferente de la longitud en casos como vectores (o cadenas), puede haber 10 caracteres en una cadena, pero el almacenamiento está reservado para 20. También puede referirse al número de elementos - verificar fuente / documentación.

Capacity()- se usa para referirse específicamente al espacio asignado en la colección y no al número de elementos válidos en él. Si el tipo tiene definidas "capacidad" y "tamaño", entonces "tamaño" generalmente se refiere al número de elementos reales.

Creo que el punto principal se debe al lenguaje humano y a las expresiones idiomáticas, el tamaño de una cadena no parece muy obvio, mientras que la longitud de un conjunto es igualmente confusa a pesar de que podrían usarse para referirse a la misma cosa (número de elementos ) en una recopilación de datos.

gbjbaanb
fuente
55
Entonces, ¿qué es una "colección más flexible"? No veo la diferencia entre tamaño y cuenta aquí.
Sophie Alpert el
32
@ben: tamaño = espacios disponibles, cuenta = elementos reales. tamaño == cuenta cuando la colección está llena.
Steven Evers
8
Votación negativa porque se size()refiere al número de elementos en el vector, no su capacity()... al menos en C ++, que creo que es el creador de vectors con sizes.
Dave Abrahams
10
@DaveAbrahams: nunca dije que ese fuera el caso. Leelo de nuevo. Dije que "tiende a referirse", ni siquiera intenté hacer una declaración específica que se aplicara igualmente a todas las permutaciones de todas las clases de colección en todos los idiomas.
gbjbaanb
2
@SnOrfus Creo que has entrado en el ámbito de la "capacidad" allí. std::vector(C ++), por ejemplo, utiliza "capacidad" y "tamaño", donde utiliza "tamaño" y "conteo", respectivamente. En realidad, todo lo que sestd:: utiliza en "tamaño" para el recuento de elementos actual, incluso std::string(que proporciona "tamaño" para compatibilidad de plantillas y una "longitud" completamente idéntica para ... conveniencia humana, supongo).
Jason C
28

FWIW (y eso se desvanece casi nada), prefiero 'Count' porque parece indicar que va a devolver el número de elementos / elementos de la colección de manera bastante clara.

Cuando me enfrento a los términos 'Longitud' o 'Tamaño', a menudo me pregunto por un momento (o incluso me veo obligado a volver a leer la documentación) si esa maldita cosa me va a decir cuántos elementos hay en la colección o cómo muchos bytes consume la colección. Esto es particularmente cierto para las colecciones que están destinadas a ser contorneadas como matrices o cadenas.

Pero nadie que fuera responsable de las convenciones de nomenclatura utilizadas por los marcos / bibliotecas estándar de Java, BCL / .Net o C / C ++ se molestó en preguntarme, por lo que todos están atrapados con lo que sea que se les ocurrió.

Si solo fuera mucho más inteligente que yo y me llamaran Bjarne, todos ustedes podrían salvarse de la miseria ...

Por supuesto, en el mundo real, debe tratar de cumplir con cualquier convención de nomenclatura utilizada por el lenguaje / plataforma que está utilizando (por ejemplo, size()en C ++). No es que esto parezca ayudarte con tu Array.Lengthdilema.

Michael Burr
fuente
16
Si bien Longitud y Tamaño son sustantivos, Count también es un verbo, por lo que podría interpretarse como contar en tiempo de ejecución (O (n)) versus buscar un valor (O (1)).
mbx
De hecho, así es exactamente como se usa en LINQ: Enumerable.Count
Edward Brey
11

Los términos son algo intercambiables, aunque en algunas situaciones preferiría uno sobre otro. Por lo general, puede obtener el mejor uso si piensa en ¿Cómo describiría la longitud / tamaño / recuento de este elemento verbalmente a otra persona?

length()implica que el elemento tiene una longitud. Una cadena tiene una longitud. Dices "una cadena tiene 20 caracteres", ¿verdad? Entonces tiene una longitud.

size()implica que el elemento tiene un tamaño. Por ejemplo, un archivo tiene un tamaño. Dices "este archivo tiene un tamaño de 2 MB", ¿verdad? Entonces tiene un tamaño.

Dicho esto, una cadena también puede tener un tamaño, pero esperaría algo más aquí. Por ejemplo, una cadena UTF-16 puede tener una longitud de 100 caracteres, pero como cada carácter está compuesto por dos bytes, esperaría que el tamaño sea 200.

count()Es muy inusual. Objective-C usa el recuento para la cantidad de elementos en una matriz. Se podría argumentar si una matriz tiene una longitud (como en Java), tiene un tamaño (como en la mayoría de los otros idiomas) o tiene un conteo. Sin embargo, el tamaño podría ser nuevamente el tamaño en byte (si los elementos de la matriz son de 32 bits int, cada elemento es de 4 bytes) y la longitud ... No diría "una matriz tiene 20 elementos de largo", eso suena bastante extraño para yo. Yo diría que "una matriz tiene 20 elementos". No estoy seguro si count lo expresa muy bien, pero creo que count es aquí una forma abreviada de elementCount()y eso nuevamente tiene mucho más sentido para una matriz que length () o size ().

Si crea objetos / elementos propios en un lenguaje de programación, es mejor usar cualquier otro elemento similar, ya que los programadores están acostumbrados a acceder a la propiedad deseada usando ese término.

Mecki
fuente
Siguiendo su analogía de cadena, un archivo debe tener un length, pero diferentes almacenamientos pueden usar diferentes sizespara almacenar sus datos. Java también lo cree en java.io.File # length () , pero parece que el resto del mundo no está de acuerdo.
Ivan Balashov
1
@IvanBalashov Nunca usé "longitud de archivo" en la conversación diaria, para mí un archivo no tiene longitud sino un tamaño y eso es lo que escribí en mi respuesta. Siempre que estamos hablando de bytes sin procesar, estamos hablando de tamaño IMHO y un archivo sin contenido específico más cercano es solo un montón de bytes. La longitud generalmente no se usa para expresar el recuento de bytes, sino para expresar una acumulación de elementos unidos (los bytes no son elementos para mí, más los bloques de construcción para formar elementos y tampoco están "unidos").
Mecki
4

Contar creo que es el término más obvio para usar si estás buscando la cantidad de elementos en una colección. Eso incluso debería ser obvio para los nuevos programadores que aún no se han apegado particularmente a un idioma dado.

Y debería ser una propiedad, ya que eso es lo que es: una descripción (también conocida como propiedad) de la colección. Un método implicaría que tiene que hacer algo a la colección para obtener el número de elementos y eso parece poco intuitivo.

Corin
fuente
3

Hmm ... no usaría el tamaño. Porque esto podría confundirse con el tamaño en bytes. Longitud: podría tener sentido para las matrices, siempre que se suponga que usen bytes de memoria consecuentes. Aunque ... longitud ... ¿en qué? El recuento es claro. Cuantos elementos Yo usaría contar.

Acerca de la propiedad / método, usaría la propiedad para marcarlo rápido, y el método para marcarlo es lento.

Y lo más importante: me apegaría a los estándares de los idiomas / bibliotecas que está utilizando.

Paul Kapustin
fuente
Entonces, ¿qué pasa con un DataBlock, solo un montón de bytes? ¿Tiene una longitud o tiene una talla?
Mecki
2

Agregando a la respuesta de @ gbjbaanb ...

Si "propiedad" implica acceso público al valor, diría que se prefiere "método" simplemente para proporcionar encapsulación y ocultar la implementación.

Puede cambiar de opinión sobre cómo usar countelementos o cómo mantenerlos count. Si es una propiedad, está atascado; si se accede a través de un método, puede cambiar la implementación subyacente sin afectar a los usuarios de la colección.

Ken Gentle
fuente
¿Por qué estás "atascado" si está expuesto como una propiedad? Las propiedades tienen una implementación subyacente que puede cambiar con la misma facilidad sin romper la interfaz. De hecho, la mayoría de los idiomas implementan propiedades como métodos get / set generados por el compilador de todos modos ... simplemente no puede llamarlos directamente.
Scott Dorman
¿A qué "la mayoría de los idiomas" te refieres? C, C ++, Java (solo por nombrar algunos) no hacen esto. Ruby y Groovy lo sé. Tenga en cuenta también cómo comencé la respuesta: "Si 'propiedad' implica ..." ¿Por qué atascado? Si la interfaz de la clase cambia, los clientes deben cambiar (en general)
Ken Gentle
1

En Elixir, en realidad, hay un esquema de nomenclatura claro asociado con él en todos los tipos del idioma.

Al "contar" el número de elementos en una estructura de datos, Elixir también se rige por una regla simple: la función se nombra sizesi la operación está en tiempo constante (es decir, el valor se calcula previamente) o lengthsi la operación es lineal (es decir, calcular la longitud se vuelve más lenta a medida que crece la entrada).

bola brillante
fuente
0

Para mí, esto es un poco como preguntar si "foreach" es mejor que "para cada uno". Solo depende del lenguaje / marco.

EBGreen
fuente
¿Y qué importa? ¿Que cambios? ¿Todos vamos a escribir correos electrónicos enojados a la gente de Java por elegir dos y ser inconsistentes?
S.Lott
1
Ese es mi punto. ¿Por qué preguntarse cuál es mejor? Es lo que es.
EBGreen
0

Yo diría que depende del lenguaje particular que estés usando y de las clases . Por ejemplo, en c # si está utilizando Array, tiene la longitud de la propiedad , si tiene algo que hereda de IEnumerable, tiene la extensión Method Count (), pero no es rápida. Y si heredó de ICollection, tiene Property Count.

Alexandr
fuente