количество против длины против размера в коллекции - PullRequest
155 голосов
/ 19 ноября 2008

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

Наиболее распространенными являются length, count и size.

например.

array.length
vector.size()
collection.count

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

Есть ли предпочтение, чтобы это было свойство вместо метода?

Ответы [ 9 ]

218 голосов
/ 19 ноября 2008

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

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

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

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

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

26 голосов
/ 02 октября 2009

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

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

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

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

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

10 голосов
/ 19 ноября 2008

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

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

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

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

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

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

4 голосов
/ 19 ноября 2008

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

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

3 голосов
/ 19 ноября 2008

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

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

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

2 голосов
/ 19 ноября 2008

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

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

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

1 голос
/ 14 июня 2016

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

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

0 голосов
/ 02 декабря 2015

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

0 голосов
/ 19 ноября 2008

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

...