VB.net - Урок 5 - Массивы
При работе с массивами программисты довольно часто сталкиваются с некоторыми проблемами. Например, приходится создавать свои алгоритмы поиска и сортировки элементов.
С выходом новой платформы Microsoft .NET существенно увеличилась функциональность массивов.
Правила объявления массивов.
Единственное существенное изменение - теперь нумерация элементов массива по умолчанию начинается с нуля.
Dim a (11) As Date ' Одномерный массив, содержащий 12 элементов
Dim b (9, 11) As Object ' Двухмерный массив размером 10*12 элементов
Dim c () As Integer ' Динамический массив
Dim a () As Integer = {1, 2, 3, 4, 5} ' Объявление с инициализацией
Dim b(,) As String = {{"аа", "аб"}, {"ба", "бб"}} ' Объявление с инициализацией многомерного массива
Создаем массив и заполняем его случайными значениями
( 1 строка на рисунке)
'textBox - txtRez
Private Sub cmdOk_Click(sender As Object, e As EventArgs) Handles cmdOk.Click
Dim mass(25)
Dim max = mass.Length - 1 'размер массива -1
Dim r As New Random 'переменная как новое случайное число
' --- создаем массив
'очистка текстПоля
txtRez.Text = ""
'заполняем массив случайными числами и выводим в текст
For i = 0 To 24
mass(i) = r.Next(1, (max))
txtRez.Text += Str(mass(i))
Next
Самый распространенный способ сортировки - метод пузырька.
В простонародие метод пузырька так же называют «Пузырьковой сортировкой». Ну, суть сортировки методом пузырька вытекает из названия. Мы находим минимальный элемент (пузырек) в массиве и выставляем его первым элементом нашего массива (поднимаем на поверхность). Далее находим следующий минимальный элемент и так же его выставляем вслед за первым элементом. И так мы будет действовать до самого конца.
Его мы рассмотрим в ниже
сортировка по возрастанию
( 2 строка на рисунке)
' --- 1 to max ( продолжаем код)
Dim u As Integer
txtRez.Text += vbCrLf
'' сортировка пузырьком
For i = 0 To max - 1
For j = 0 To max - 2
If mass(j) > mass(j + 1) Then
u = mass(j)
mass(j) = mass(j + 1)
mass(j + 1) = u
End If
Next j
Next i
'вывод массива
For i = 0 To max - 1
txtRez.Text += Str(mass(i))
Next i
сортировка по убыванию
( 3 строка на рисунке)
' --- max to 1 (продолжаем код)
txtRez.Text += vbCrLf
'' сортировка пузырьком
For i = 0 To max - 1
For j = 0 To max - 2
If mass(j) < mass(j + 1) Then ' меняем знак и сортируем по убыванию
u = mass(j)
mass(j) = mass(j + 1)
mass(j + 1) = u
End If
Next j
Next i
'вывод массива
For i = 0 To max - 1
txtRez.Text += Str(mass(i))
Next i
Перемешивание массива
( 4 строка на рисунке)
Кроме сортировки массива, иногда бывает, необходимость перемешать значения массива. В отличии от заполнения массива случайными значениями - перемешивание использует только те значения, которые были в массиве изначально (причем только 1 раз).
Код ниже
' --- random - перемешивание массива (продолжаем код)
Dim element1, element2, x, y 'для перемешивания массива
txtRez.Text += vbCrLf
'перемешивание
Randomize()
For i = 0 To 10000
x = Int(Rnd() * max) 'Определили случайный элемент массива с номером х
y = Int(Rnd() * max) 'Определили случайный элемент массива с номером y
element1 = mass(x) 'Запомнили значение случайного х-элемента массива
element2 = mass(y) 'Запомнили значение случайного y-элемента массива
mass(y) = element1 'Присвоили случайному x элементу значение y элемента
mass(x) = element2 'Присвоили случайному y элементу значение x элемента
Next
For i = 0 To max - 1
txtRez.Text += Str(mass(i))
Next
End Sub
Конец кода
Кроме этих вариантов инициализации массивов, есть еще несколько способов:
- Ввод значений вручную через InputBox
(для проверки введенных данных - отсортируем массив)
'ввод вручную
txtRez.Text = ""
Dim _in As String = InputBox("Введите последовательность целых чисел, разделенных ',':", "Сортировка 'пузырьком'")
Dim _vals As List(Of Integer) = New List(Of Integer)
'Формирование списка целых чисел по входной строке
'и ловим исключения
Try
For Each _val As String In _in.Split(",")
_vals.Add(System.Convert.ToInt32(_val))
Next
Catch ex As Exception
MsgBox(ex.Message, Microsoft.VisualBasic.MsgBoxStyle.Critical, "Ошибка")
Return
End Try
Dim _changed As Boolean = True
Dim _sorted As Integer = 0
While _changed
_changed = False
'сортировка
For i As Integer = 0 To _vals.Count - 2 - _sorted Step 1
If _vals(i) > _vals(i + 1) Then
Dim _val As Integer
_val = _vals(i + 1)
_vals(i + 1) = _vals(i)
_vals(i) = _val
_changed = True
End If
Next
_sorted = _sorted + 1
End While
'Формирование выходной строки
Dim _out As String = String.Empty
For Each _val As Integer In _vals
If (_out.Length > 0) Then
_out = _out + ","
End If
_out = _out + _val.ToString
Next
'vbCrLf и Environment.NewLine - одно и тоже - переход на новую строку
txtRez.Text += "Сортировка 'пузырьком'" + vbCrLf + "Отсортированная последовательность:" + Environment.NewLine + _out
- ввод массива из текстового поля
(каждое значение на новой строке)
txtM.Text = ""
'создаем переменную как новый лист с числами размера int
Dim _vals As List(Of Integer) = New List(Of Integer)
'каждая строка в txt преобразуется в int и добавляется в лист
For Each _val As String In txt1.Lines
_vals.Add(System.Convert.ToInt32(_val))
Next
'переменные
Dim _changed As Boolean = True
Dim _sorted As Integer = 0
While _changed
_changed = False
'сортировка
For i As Integer = 0 To _vals.Count - 2 - _sorted Step 1
If _vals(i) > _vals(i + 1) Then
Dim _val As Integer
_val = _vals(i + 1)
_vals(i + 1) = _vals(i)
_vals(i) = _val
_changed = True
End If
Next
_sorted = _sorted + 1
End While
'Формирование выходной строки
Dim _out As String = String.Empty
For Each _val As Integer In _vals
If (_out.Length > 0) Then
_out = _out + ","
End If
_out = _out + _val.ToString
Next
txtM.Text += "Сортировка 'пузырьком'" + vbCrLf + "Отсортированная последовательность:" _
+ Environment.NewLine + _out
Поиск элементов
Класс Array предлагает два метода поиска элементов: простой и двоичный.
Для простого поиска используются методы IndexOf и LastIndexOf. IndexOf ищет первое вхождение указанного объекта, а LastIndexOf - последнее
Public Shared Function
IndexOf(ByVal array As System.Array, ByVal value As Object) As Integer
Public Shared Function
IndexOf(ByVal array As System.Array, ByVal value As Object,
ByVal startIndex As Integer) As Integer
Public Shared Function
IndexOf(ByVal array As System.Array, ByVal value As Object,
ByVal startIndex As Integer, ByVal count As Integer) As Integer
Первый вариант служит для поиска первого появления искомого элемента в целом массиве, второй - для поиска элементов в части массива, начиная с указанного индекса и до конца, третий - для поиска элемента в части массива, который начинается с указанного индекса и содержит в себе указанное число элементов.
При использовании IndexOf и LastIndexOf программа в цикле проверяет все элементы массива и сравнивает их с искомым объектом.
Метод возвращает индекс найденного элемента, если поиск увенчался успехом или -1, если ничего не найдено. Все сказанное относится и к методу LastIndexOf. Для наглядности приведу примеры использования функций поиска:
Dim a() As String = {"a", "b", "c", "a", "b", "c"}
Console.WriteLine(System.Array.IndexOf(a, "b"))
Console.WriteLine(System.Array.IndexOf(a, "b", 2))
Console.WriteLine(System.Array.LastIndexOf(a, "b", 3, 3))
Двоичный поиск работает несколько иначе. Он значительно быстрее простого поиска, но может работать только с отсортированными массивами (о сортировке массивов речь пойдет позже).
Чтобы найти объект в массиве, BinarySearch сравнивает его с элементом, расположенным в середине массива. Если искомый объект оказывается меньше, значит он находится в первой половине массива, и во второй половине можно его не искать. А если искомый объект больше, то он располагается во второй половине массива. Далее процесс повторяется для той половины массива, в которой находится объект.
Если объект найден, то метод BinarySearch вернет индекс элемента массива. А если искомый объект не найден, то метод вернёт отрицательное число. Если дополнить его до -1 (изменить знак и вычесть 1), то получится индекс первого из тех элементов массива, которые больше искомого объекта. Если все элементы массива меньше искомого, то получится индекс большего из них. Ниже приведен пример использования метода BinarySearch:
Dim a() As String = {"a", "b", "c", "e", "f"}
Dim ind As Integer
ind = System.Array.BinarySearch(a, "d")
If ind >= 0 Then
Console.WriteLine("Элемент найден: " & ind.ToString)
Else
Console.WriteLine("Найдено ближайшее соответствие: " & (-ind - 1).ToString)
End If
Другая полезная возможность, которую предоставляет класс System.Array - сортировка массива. Она производится с помощью метода Sort. Он также перегружен. Самый простой вариант его применения выглядит так:
Array.Sort(массив, начЭлем, конЭлем)
Public Shared Sub Sort(ByVal array As System.Array)
Он сортирует весь массив. Если вы хотите отсортировать только часть массива, то к параметру array следует добавить индекс начального элемента и длину области, которую вы хотите отсортировать. Sort, в отличие от методов рассмотренных ранее, ничего не возвращает. Ниже приведен пример сортировки части массива.
Dim a() As String = {"c", "r", "z", "b", "d", "a"}
System.Array.Sort(a, 2, 4)
У метода Sort есть ещё одна интересная разновидность, позволяющая сортировать элементы одного массива в соответствии со значениями элементов другого массива.
Public Shared Sub Sort(ByVal keys As System.Array, ByVal items As System.Array)
В первом параметре задаётся массив ключей. На основе элементов этого массива будет отсортирован массив, передаваемый во втором параметре. Допустим, у нас имеется массив со словами (words) и массив, в котором для каждого слова указана частота его употребления в тексте (freq). Используя первую форму метода Sort можно отсортировать слова по алфавиту. А с помощью последней рассмотренной формы метода мы можем отсортировать слова по частоте их использования. Для этого нужно первым параметром указать массив freq, а вторым - words.
System.Array.Sort (freq, words)
Такая сортировка имеет смысл, если длины массивов равны.
Смотреть видео
END
|