Проведение моего времени на высокоуровневых языках, мне внезапно пришло в голову, что я не знал различия между Массивом символов и Строкой. Я думаю, что они - то же самое, но не уверенные. Существует ли различие? Это - просто Массив символов с некоторой абстракцией?
No. Это можно сделать только с помощью динамического запроса. Мне было бы очень интересно узнать, есть ли способ.
Есть несколько примеров, когда быстрый поиск Google был найден с помощью COALESCE
для создания списка столбцов. Однако я предпочитаю создавать список столбцов с помощью STUFF
. Однако я нашел эту статью об использовании CTE и динамических шарниров , которые также могут быть полезны
Это должно работать (используя ту же функцию MySQL, которую вы использовали):
Review.objects.filter(venue__pk=2)
.extra({'date_created' : "date(datetime_created)"})
.values('date_created')
.annotate(created_count=Count('id'))
-121--1071586- символьный массив - это просто массив символов
последовательностей структура данных, в которой используется массив символов
некоторые последовательности представления используют нуль-терминатор (например, C), другие используют префикс длины
Строка
- это класс
в java. Итак, у него есть атрибуты, например. длина
. Поэтому, когда вы запрашиваете размер строки, он просто возвращает его вместо того, чтобы каждый раз вычислять значение. Это также другие методы, например. indexOf
, substring
и т. Д., Чтобы упростить жизнь, чтобы вам не приходилось делать это самостоятельно.
Строка в стиле C внутренне представлена массивом символов с символом '\ 0' в конце, который указывает конец строки.
В C ++ существует класс строкового контейнера, определенный в string.h, который предоставляет некоторые типичные строковые операции для управления строкой.
Строка является абстракцией, но представляет собой последовательность символов. Это ничего не говорит о реализации. Если вы хотите создать реализацию String на основе связанного списка символов, вас ничто не остановит.
В таком языке, как C, разница очень небольшая - просто строка c представляет собой серию символов с завершающим нулем в последовательных адресах, доступ к которой обычно осуществляется через указатель.
В языке ООП String будет объектом некоторого класса String. Это, вероятно, будет содержать данные в массиве символов внутри, но вам не нужно об этом знать. Массив символов может быть только простым массивом, но класс String может предоставлять множество операций (подстроки, регулярное выражение и т. Д.) Над строками, если разработчик решит это сделать.
Раньше я преподавал программирование, и именно так я объяснял эту конкретную проблему.
Во-первых, сосредоточьтесь на том, что у обоих элементов общего : и массив символов, и строка состоят из последовательности символов. Последовательность означает, что символы упорядочены и, например, могут быть пронумерованы.
Теперь сосредоточьтесь на том, что каждая из этих двух вещей добавляет, по-своему различными способами, к этой общей основе.
Массив char добавляет то, что, как известно, добавляет любой массив: индексирование и произвольный доступ к отдельным элементам.
Строка , с другой стороны, добавляет тот факт, что последовательность символов рассматривается как единое целое со своими собственными свойствами. В некоторых реализациях это означает изменение способа хранения символов (например, добавление завершающего нуля в C-строки).
Этот подход (посмотрите на общие черты, а затем на то, как вещи расходятся) оказался полезным в самых разных ситуациях.
Надеюсь, это поможет.
В C это почти то же самое, хотя строка будет иметь дополнительный нулевой символ в конце.
В других языках (Java, C# и т.д.) строка - это объект, а символьный массив - это массив ... символов (которые являются примитивными типами данных).
Обычно строки реализуются с помощью символьных массивов.
Ответ в некоторой степени зависит от того, на каком языке вы говорите. В мире .Net / C # строки являются неизменяемыми объектами, тогда как в массиве символов вы можете легко добавлять / изменять значения в массиве. Строки можно рассматривать как массивы символов только для чтения, так как вы можете перебирать символы в строке.
Говоря абстрактно, я думаю, что самая большая разница в том, как вы хотите с ними работать. Вы хотите работать с фрагментом текста, скажем, чтобы показать сообщение конечному пользователю, или вы смотрите на последовательность символов, выполняя некоторую обработку списка? На определенном уровне все это довольно субъективно.
Это зависит от языка. В языках Си-иш они в значительной степени синонимы. Вы могли бы утверждать, что разница в том, что «строки» имеют неявный завершающий нуль, но это было бы разделением волос.
Фортран - другая крайность. Существуют символьные массивы и символьные строки совершенно разных типов, с которыми доступны разные операции.