Count vs length vs size в коллекции

Из нескольких языков программирования и библиотек я заметил различные термины, используемые для общего количества элементов в коллекции.

Наиболее часто встречаются length, count и size.

например.

array.length
vector.size()
collection.count

Есть ли какой-либо предпочтительный термин для использования? Это зависит от того, какой тип коллекции он имеет? то есть. изменяемый/неизменяемая

Есть ли предпочтение для этого свойства вместо метода?

Ответ 1

Length() имеет тенденцию ссылаться на смежные элементы - например, строка имеет длину.

Count() имеет тенденцию ссылаться на количество элементов в более свободной коллекции.

Size() имеет тенденцию ссылаться на размер коллекции, часто это может отличаться от длины в таких случаях, как векторы (или строки), в строке может быть 10 символов, но память зарезервирована для 20. Это также может ссылаться на количество элементов - проверить источник/документацию.

Capacity() - используется специально для обозначения выделенного пространства в коллекции, а не количества действительных элементов в нем. Если тип имеет как "емкость", так и "размер", тогда "размер" обычно относится к числу фактических элементов.

Я думаю, что основное внимание уделяется человеческому языку и идиомам, размер строки не кажется очень очевидным, в то время как длина набора одинаково запутанна, хотя они могут использоваться для обозначения одного и того же ( количество элементов) в наборе данных.

Ответ 2

FWIW (и это исчезающе близко к чему-либо), я предпочитаю "Count", потому что он, похоже, указывает, что он будет возвращать количество элементов/элементов в коллекции довольно однозначно.

Когда вы сталкиваетесь с терминами "Длина" или "Размер", я часто оставляю на некоторое время (или даже вынужден перечитывать документацию), будет ли чертовски рассказывать мне, сколько элементов находится в или количество байтов, потребляемых коллекцией. Это особенно справедливо для коллекций, которые предназначены для создания контуров, таких как массивы или строки.

Но никто, кто отвечал за соглашения об именах, используемые стандартными фреймворками/библиотеками Java, BCL/.Net или C/С++, не удосужился спросить меня, поэтому вы все застряли с тем, что они придумали.

Если бы я был намного умнее, чем я, и был назван Бьярне, все вы могли бы избавиться от страдания...

Конечно, вернувшись в реальный мир, вы должны попытаться придерживаться любого соглашения об именах используемого языка/платформы, которые вы используете (например, size() в С++). Не то чтобы это помогло вам с вашей дилеммой Array.Length.

Ответ 3

Термины несколько взаимозаменяемы, хотя в некоторых ситуациях я бы предпочел одно другому. Обычно вы можете получить лучшее использование, если подумаете о Как бы вы описали длину/размер/количество этого элемента в устной форме другому человеку?

length() подразумевает, что элемент имеет длину. Строка имеет длину. Вы говорите "строка длиной 20 символов", верно? Так что у него есть длина.

size() подразумевает, что элемент имеет размер. Например. файл имеет размер. Вы говорите "этот файл имеет размер 2 МБ", верно? Так что у него есть размер.

Тем не менее, строка также может иметь размер, но я бы ожидал чего-то другого здесь. Например. строка UTF-16 может иметь длину 100 символов, но, поскольку каждый символ состоит из двух байтов, я ожидаю, что размер будет 200.

count() очень необычный. Objective-C использует счетчик для количества элементов в массиве. Можно спорить, если массив имеет длину (как в Java), имеет размер (как в большинстве других языков) или имеет счетчик. Тем не менее, размер может снова быть размером в байтах (если элементы массива 32-битные целые, каждый элемент по 4 байта) и длиной... Я бы не сказал, что "массив состоит из 20 элементов", что звучит довольно странно для меня. Я бы сказал, что "массив состоит из 20 элементов". Я не уверен, что count это очень хорошо выражает, но я думаю, что здесь это краткая форма для elementCount(), и это опять же имеет гораздо больший смысл для массива, чем length() или size().

Если вы создаете собственные объекты/элементы на языке программирования, лучше всего использовать любые другие подобные элементы, поскольку программисты привыкли получать доступ к желаемому свойству с помощью этого термина.

Ответ 4

Count Я думаю, что это самый очевидный термин для использования, если вы ищете количество элементов в коллекции. Это должно быть очевидным для новых программистов, которые еще не стали особенно привязаны к данному языку.

И это должно быть свойство как то, что это такое: описание (aka property) коллекции. Метод подразумевает, что он должен что-то сделать для коллекции, чтобы получить количество элементов, и это просто кажется неинтуитивным.

Ответ 5

Хмм... Я бы не использовал размер. Потому что это может быть путано с размером в байтах. Длина - может иметь смысл для массивов, если они должны использовать последующие байты памяти. Хотя... длина... в чем? Граф ясен. Сколько элементов. Я бы использовал count.

О свойстве/методе, я бы использовал свойство, чтобы быстро его пометить, а метод - медленно.

И, самое главное, я придерживаюсь стандартов используемых вами языков/библиотек.

Ответ 6

Добавление в @gbjbaanb ответа...

Если "свойство" подразумевает открытый доступ к значению, я бы сказал, что "метод" предпочтительнее просто обеспечить инкапсуляцию и скрыть реализацию.

Вы можете изменить свое мнение о том, как элементы count или как вы поддерживаете это count. Если это свойство, вы застряли - если он используется методом, вы можете изменить базовую реализацию, не затрагивая пользователей коллекции.

Ответ 7

В Elixir на самом деле существует четкая схема именования, связанная с ней по типам на языке.

Когда "подсчет" количества элементов в структуре данных, Elixir также выполняется простым правилом: функция называется size, если работа выполняется в постоянное время (т.е. значение предварительно вычисляется) или length, если операция линейна (т.е. вычисление длины получает медленнее по мере увеличения входа).

Ответ 8

Для меня это немного похоже на вопрос, лучше ли "foreach", чем "для каждого". Это зависит только от языка/структуры.

Ответ 9

Я бы сказал, что это зависит от конкретного языка, который вы используете, и классов. Например, в С#, если вы используете Array, у вас есть Свойство Длина, если у вас есть что-то, что наследуется от IEnumerable, у вас есть расширение Метод Count(), но это не быстро. И если вы унаследовали от ICollection, у вас есть Свойство.