2016-08-21 3 views
2

Я ищу способ хранения данных в VBS какмагазин координаты в ассоциативном массиве

[ 0 => [posX, posY], 1 => [posX, posY] ] 

Любопытное ассоциативный массив с координатами в качестве значений.

+0

Если я правильно помню (я не использовал VBScript более 15 лет), ближайшая структура данных к ассоциативным массивам - это * словарь *. Однако ваши данные образца выглядят как обычные массивы: -? –

+0

какая версия vbscript? Эта вещь имеет 20-летнюю историю, теперь .. –

+0

@ MarcusMüller C++ 37 лет в этом году и по-прежнему является одним из наиболее широко используемых языков производства, поэтому в чем ваш смысл? Возраст не должен быть определяющим фактором, если они хотят, чтобы скрипт с VBScript позволял им. – Lankymart

ответ

5

Ассоциативные массивы называются Dictionary в VBScript. Вы бы хранить координаты в них, как это:

Set coords = CreateObject("Scripting.Dictionary") 
coords.Add 1, Array(1, 5) 
coords.Add 2, Array(3, 2) 

WScript.Echo coords(1)(1) 'ouput: 5 
WScript.Echo coords(2)(0) 'ouput: 3 

С учетом сказанного, учитывая ваш пример, который вы можете создать массив словарей вместо словаря массивов:

Sub AddCoordinates(ByRef list, posX, posY) 
    Set d = CreateObject("Scripting.Dictionary") 
    d.Add "posX", posX 
    d.Add "posY", posX 

    ReDim Preserve list(UBound(list)+1) 
    Set list(UBound(list)) = d 
End Sub 

ReDim coords(-1) 
AddCoordinates(coords, 1, 5) 
AddCoordinates(coords, 3, 2) 
... 

WScript.Echo coords(0)("posY") 'ouput: 5 
WScript.Echo coords(1)("posX") 'ouput: 3 

Массив пользовательские объекты были бы еще одним вариантом:

Class Point 
    Private posX_ 
    Private posY_ 

    Public Property Get posX 
    posX = posX_ 
    End Property 
    Public Property Let posX(val) 
    posX_ = val 
    End Property 

    Public Property Get posY 
    posY = posY_ 
    End Property 
    Public Property Let posY(val) 
    posY_ = val 
    End Property 
End Class 

Sub AddCoordinates(ByRef list, posX, posY) 
    Set p = New Point 
    p.posX = posX 
    p.posY = posX 

    ReDim Preserve list(UBound(list)+1) 
    Set list(UBound(list)) = p 
End Sub 

ReDim coords(-1) 
AddCoordinates(coords, 1, 5) 
AddCoordinates(coords, 3, 2) 
... 

WScript.Echo coords(0).posY 'ouput: 5 
WScript.Echo coords(1).posX 'ouput: 3 
+0

Удивительный ответ, спасибо большое. Последний вопрос: можно ли найти «ближайший» элемент в словаре? Например, у меня есть координаты в 0 и 100. Если я получу 75, мне бы хотелось узнать ближайшие координаты (0 и 100 в этом случае). Я хочу интерполировать отсутствующие координаты, поэтому это было бы невероятно полезно. – nehalist

+0

Возможно, вы захотите опубликовать новый вопрос с небольшим пояснением (и, возможно, некоторыми примерами), потому что я не понимаю, что вы подразумеваете под «интерполировать отсутствующие координаты» здесь. –

+1

'Словарь' не является вашим единственным вариантом, также будет работать' Array' внутри 'Array'. 'coords = Array (Array (1, 5), Array (3, 2), ...) ', вы бы назвали его с помощью ординалы, как' posX = coords (1) (0) ', равным' 3' в этом примере. – Lankymart

1

Несомненно, вот так. Словарь - это ключевое решение vbscript.

Set objDictionary = CreateObject("scripting.dictionary") 
objDictionary.Add 0, Array(1, 2) 
objDictionary.Add 1, Array(3, 4) 
WScript.Echo join(objDictionary.item(0)) '=>1 2' 

Как и другие комментарии, vbscript больше не используется. Вот пример, в более позднем языке, как Рубин

hash = {} 
hash[0] = [1, 2] 
hash[1] = [3, 4] 
# gives {0=>[1, 2], 1=>[3, 4]} 

или в качестве одной линии

Hash.new{}.merge(0 => [1, 2], 1 => [3, 4]) 
# gives {0=>[1, 2], 1=>[3, 4]} 
Смежные вопросы