Это моя реализация BubbleSort :
Option Explicit
Public Function fnVarBubbleSort(ByRef colInput As Collection, Optional bAsc = True) As Collection
Dim varTemp As Variant
Dim lngCounter As Long
Dim lngCounter2 As Long
For lngCounter = 1 To colInput.Count - 1
For lngCounter2 = lngCounter + 1 To colInput.Count
Select Case bAsc
Case True:
If colInput(lngCounter) > colInput(lngCounter2) Then
varTemp = colInput(lngCounter2)
colInput.Remove lngCounter2
colInput.Add varTemp, varTemp, lngCounter
End If
Case False:
If colInput(lngCounter) < colInput(lngCounter2) Then
varTemp = colInput(lngCounter2)
colInput.Remove lngCounter2
colInput.Add varTemp, varTemp, lngCounter
End If
End Select
Next lngCounter2
Next lngCounter
Set fnVarBubbleSort = colInput
End Function
Public Sub TestMe()
Dim colCollection As New Collection
Dim varElement As Variant
colCollection.Add "2342"
colCollection.Add "vityata"
colCollection.Add "na"
colCollection.Add "baba"
colCollection.Add "ti"
colCollection.Add "hvarchiloto"
colCollection.Add "stackoveflow"
colCollection.Add "beta"
colCollection.Add "zuzana"
colCollection.Add "zuzan"
colCollection.Add "2z"
colCollection.Add "alpha"
Set colCollection = fnVarBubbleSort(colCollection)
For Each varElement In colCollection
Debug.Print varElement
Next varElement
Debug.Print "--------------------"
Set colCollection = fnVarBubbleSort(colCollection, False)
For Each varElement In colCollection
Debug.Print varElement
Next varElement
End Sub
Он берет коллекцию по ссылке, поэтому она может легко вернуть ее как функцию и имеет необязательный параметр для Сортировка по возрастанию и убыванию. Сортировка возвращает это в ближайшем окне:
2342
2z
alpha
baba
beta
hvarchiloto
na
stackoveflow
ti
vityata
zuzan
zuzana
--------------------
zuzana
zuzan
vityata
ti
stackoveflow
na
hvarchiloto
beta
baba
alpha
2z
2342
Тип карты. http://golang.org/doc/effective_go.html#maps
Есть некоторое отличие от python в том, что ключи нужно вводить, , поэтому вы не можете смешивать числовые и строковые ключи (почему-то забыл, что можно), но ими довольно легко пользоваться.
dict := make(map[string]string)
dict["user"] = "so_user"
dict["pass"] = "l33t_pass1"
Чтобы немного расширить уже данные ответы:
Карта Go - это типизированная структура данных хеш-карты. Сигнатура типа карты имеет вид map [keyType] valueType
, где keyType
и valueType
- это типы ключей и значений соответственно.
Чтобы инициализировать карту, вы должны использовать функцию make
:
m := make(map[string]int)
Неинициализированная карта равна nil
, и при чтении или записи во время выполнения произойдет паника. .
Синтаксис для хранения значений во многом такой же, как и для массивов или срезов:
m["Alice"] = 21
m["Bob"] = 17
Аналогичным образом, получение значений из карты выполняется следующим образом:
a := m["Alice"]
b := m["Bob"]
Вы можете использовать ключевое слово range
для перебора карты с помощью цикла for
:
for k, v := range m {
fmt.Println(k, v)
}
Этот код напечатает:
Alice 21
Bob 17
Получение значения для ключа, которого нет на карте, вернет нулевое значение типа значения:
c := m["Charlie"]
// c == 0
Считывая несколько значений с карты, вы можете проверить наличие ключа.Второе значение будет логическим, указывающим на наличие ключа:
a, ok := m["Alice"]
// a == 21, ok == true
c, ok := m["Charlie"]
// c == 0, ok == false
Чтобы удалить запись ключа / значения с карты, вы переверните ее и назначьте false
в качестве второго значения:
m["Bob"] = 0, false
b, ok := m["Bob"]
// b == 0, ok == false
Вы можете сохранить произвольные типы на карте с использованием пустого интерфейса type interface {}
:
n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"
Единственное условие состоит в том, что при извлечении этих значений вы должны выполнить утверждение типа, чтобы использовать их в исходной форме:
a := n["One"].(int)
b := n["Two"].(string)
Вы можете использовать переключатель типа, чтобы определить типы извлекаемых значений и обработать их соответствующим образом:
for k, v := range n {
switch u := v.(type) {
case int:
fmt.Printf("Key %q is an int with the value %v.\n", k, u)
case string:
fmt.Printf("Key %q is a string with the value %q.\n", k, u)
}
}
Внутри каждого из этих блоков case
, u
будет типа, указанного в операторе case
; нет необходимости в явном утверждении типа.
Этот код напечатает:
Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".
Ключ может быть любого типа, для которого определен оператор равенства, например целые числа, числа с плавающей запятой, строки и указатели. Типы интерфейсов также могут использоваться, если базовый тип поддерживает равенство. (Структуры, массивы и срезы нельзя использовать в качестве ключей карты, потому что для этих типов равенство не определено.)
Например, карта o
может принимать ключи любого из вышеуказанных типов:
o := make(map[interface{}]int)
o[1] = 1
o["Two"] = 2
] И это вкратце карты.