Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 9:

Операции и встроенные функции

Сборка элементов массива в строку. Функция Join

Функция Join решает обратную задачу, - она восстанавливает строку по ее элементам, хранящимся в массиве, добавляя разделители в момент их объединения. Ее синтаксис:

Join(sourcearray[, delimiter])

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

Public Sub SplitAndJoin()
'В этой процедуре сложное предложение разделяется на простые
'А затем после обработки строка восстанавливается
	'Объявляем динамический массив
	Dim Simple() As String, i As Byte
	Dim Simple1() As String, Res As String
	'Размерность массива Simple устанавливается автоматически
	'в соответствии с размерностью массива, возвращаемого функцией Split
	Simple = Split("А это пшеница, которая в темном чулане хранится в доме, " _
		& "который построил Джек", ", ")
	'Создаем новый массив
	ReDim Simple1(1 To UBound(Simple) + 2)
	Simple1(1) = "А это веселая птица - синица"
	Simple1(2) = "которая часто ворует пшеницу"
	For i = 3 To UBound(Simple1)
		Simple1(i) = Simple(i - 2)
	Next i
	'Создаем строку из массива Simple1
	
	Res = Join(Simple1, ", ")
	Debug.Print Res
End Sub

Вот результат отладочной печати:

А это веселая птица - синица, которая часто ворует пшеницу, которая в темном
чулане хранится в доме, который построил Джек
Фильтрация элементов массива. Функция Filter

Функция Filter является одним из вариантов поиска по образцу среди элементов массива. Здесь не требуется точного совпадения элемента и образца, достаточно, чтобы строка - образец содержалась в строке, заданной элементом массива. Поскольку совпадений может быть достаточно много, то результатом является массив отфильтрованных элементов. Некоторые детали будут пояснены при описании аргументов функции Filter. Вот ее синтаксис:

Filter(sourcearray, match[, include[, compare]])

Ее параметры имеют следующий смысл:

  • sourcearray - одномерный массив, элементы которого являются строками. Он может быть получен, например, как результат расщепления строки в массив.
  • match - образец поиска. Строка, вхождение которой ищется в каждом элементе исходного массива.
  • include - необязательный аргумент булевого типа. По умолчанию имеет значение True, означающее, что элементы, удовлетворяющие образцу, входят в результирующий массив. Если задано значение False, то результирующий массив составляется из элементов, не удовлетворяющих образцу.
  • compare - имеет обычный смысл.

В качестве результата возвращается массив отфильтрованных элементов.

Наш пример будет представлять расширенный вариант уже приводившейся процедуры SplitAndJoin:

Public Sub SplitAndJoin()
'В этой процедуре сложное предложение разделяется на простые
'А затем после обработки строка восстанавливается
'Здесь же демонстрируется фильтрация элементов массива
	'Объявляем динамический массив
	Dim Simple() As String, i As Byte
	Dim Simple1() As String, Res As String
	Dim Simple2() As String
	'Размерность массива Simple устанавливается автоматически
	'в соответствии с размерностью массива, возвращаемого функцией Split
	Simple = Split("А это пшеница, которая в темном чулане хранится в доме, " _
		& "который построил Джек", ", ")
	'Создаем новый массив
	ReDim Simple1(1 To UBound(Simple) + 2)
	Simple1(1) = "А это веселая птица - синица"
	Simple1(2) = "которая часто ворует пшеницу"
	For i = 3 To UBound(Simple1)
		Simple1(i) = Simple(i - 2)
	Next i
	'Создаем строку из массива Simple1
	
	Res = Join(Simple1, ", ")
	Debug.Print Res
	'Фильтрация элементов массива
	Simple2 = Filter(Simple1, "котор")
	Res = Join(Simple2, ", ")
	Debug.Print Res
	
	Simple2 = Filter(Simple1, "котор", False)
	Res = Join(Simple2, ", ")
	Debug.Print Res
End Sub
8.3.

Вот результаты отладочной печати:

А это веселая птица - синица, которая часто ворует пшеницу, которая в темном
чулане хранится в доме, который построил Джек
которая часто ворует пшеницу, которая в темном чулане хранится в доме,
который построил Джек
А это веселая птица - синица
Несколько модификаций встроенных функций

Какие бы новые возможности не появлялись в системе, программист всегда будет создавать свой собственный инструментарий, расширяющий стандартные возможности. В предыдущих разделах мы уже приводили разработанные нами функции MyReplace, DelStr, являющиеся частью такого инструментария. Сейчас мы хотим привести еще несколько функций из нашего инструментального набора. Их приведение полезно и по той причине, что эти функции используют новые средства разбора строк. Мы приведем вариации стандартных функций Replace, Filter и Split.

Несмотря на то, что уже один вариант функции Replace приведен, мы разработали еще два варианта. Оба они отражают часто возникающую необходимость производить замену, основанную не на точном совпадении, а на совпадении с шаблоном, как это делается в операции Like.Наши новые функции позволяют разные подстроки заменять одним и тем же новым содержимым. Нам не удалось написать универсальную и эффективную реализацию такой функции, поэтому мы ограничились двумя частными, но важными для практики случаями.

Замена, основанная на шаблоне. Функция WildReplace

Важным частным случаем, когда легко реализовать замену, основанную на шаблоне, представляют строки, допускающие разбор их на элементы. В этом случае алгоритм замены понятен, - строка разбирается на элементы, используя новые возможности, предоставляемые функцией Split ; затем к каждому элементу применяется операция Like для сравнения с шаблоном; на последнем шаге применяется Join для восстановления строки. Приведем текст нашей функции:

Public Function WildReplace(ByVal expr As String, ByVal find As String, _
		ByVal Rep As String, Optional ByVal delimiter As String = " ") As String
		
		'Эта функция применима в том частном случае, когда строка - источник, 
заданная аргументом Expr
		'представляет совокупность элементов, отделяемых разделителями.
		'Типичный пример - строка представляет совокупность слов, разделенных 
пробелами.
		'Как и обычная функция Replace эта функция производит замену вхождений 
элемента (подстроки) новым значением
		'Отличие от стандартной функции состоит в том, что заменяемый элемент 
(подстрока) find
		'задается шаблоном. В результате разные элементы могут быть заменены на 
новое значение.
		'Для этого частного случая WildReplace существенно расширяет стандартные 
возможности Replace
		
		'Алгоритм основан на том факте, что строка допускает разбор ее на элементы,
		'а к элементам применима операция Like - сравнения с шаблоном.
		
		Dim Words() As String, i As Long, Res As String
		
		'Разбор строки на элементы
		Words = Split(expr, delimiter)
		
		'Сравнение элементов с шаблоном и замена в случае совпадения
		For i = LBound(Words) To UBound(Words)
			If Words(i) Like find Then Words(i) = Rep
		Next i

		'Сборка строки
		Res = Join(Words, delimiter)
		WildReplace = Res
End Function
8.4.

Параметры этой функции имеют тот же смысл, что и для стандартной функции Replace. Существенное отличие состоит в том, что специальные символы шаблона допустимы в строке поиска find. Приведем теперь тестовую процедуру, осуществляющую вызов функции WildReplace:

Public Sub testWildReplace()
	Dim Inf As String, SecretInf As String
	Inf = "Agent001, Agent007, Агент Майор Пронин, Agent008"
	SecretInf = WildReplace(Inf, "Agent###", "Agent***", ", ")
	Debug.Print SecretInf
End Sub

Вот результаты ее работы:

Agent***, Agent***, Агент Майор Пронин, Agent***
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.