Что нового

Несколько вопросов про двумерные массивы

Suppir

Продвинутый
Сообщения
967
Репутация
62
1. Как объявить двумерный массив, если я точно знаю, что будет два "столбца", не знаю возможное количество элементов в этих столбцах? Их может быть 100, а может и 10000

Пишу:
Global $aKeys[100][2]

Но если элементов больше 100, то скрипт выдает ошибку "Array variable has incorrect number of subscripts or subscript dimension"

Решено:
Нужно задавать минимальное значение, а потом использовать функцию ReDim().



2. Как двумерному массиву присвоить сразу два значения (т.е. заполнить ряд $i)?

Вот так не работает
$aKeys[$i][1] = $aMatches[0]$aMatches[1]
пишет "error in expression"


Решено:
$aKeys[$i][0] = $aMatches[0]
$aKeys[$i][1] = $aMatches[1]


3. Вопрос, который представляет для меня трудную задачу:

У нас есть массив из строк следующего вида (как бы ключ и значение):

а > коза
а > коза
а > лошадь
б > собака
б > собака
б > коза
б > петух
c > зебра
c > зебра
c > слон

Необходимо для каждого уникального левого ключа вывести отсортированный по количеству список значений.
Т.е. скрипт должен вывести:

а > коза (2 шт.), лошадь (1 шт.)
б > собака (2 шт.), коза (1 шт.), петух (1 шт.)
с > зебра (2 шт.), слон (1 шт.)
 

SyDr

Сидра
Сообщения
651
Репутация
158
Suppir [?]
Как объявить двумерный массив, если я точно знаю, что будет два "столбца", не знаю возможное количество элементов в этих столбцах?
См. ReDim


Как двумерному массиву присвоить сразу два значения (т.е. заполнить ряд $i)?
Никак (хотя, можно просто объявить не двухмерный массив, а массив массивов). Что мешает написать две строки?
$aKeys[$i][0] = $aMatches[0]
$aKeys[$i][1] = $aMatches[1]
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Suppir [?]
1. Как объявить двумерный массив, если я точно знаю, что будет два "столбца", не знаю возможное количество элементов в этих столбцах?
Объявляй массив минимальной размерности, а затем используй ReDim. Пример
Код:
#include <Array.au3>
Dim $a[1][1]
For $i = 0  to 9
	ReDim $a[$i+1][2]
	For $j = 0 to 1
		$a[$i][$j] = Random()
	Next
Next
_ArrayDisplay($a)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SyDr, да, спасибо, я в соседней ветке увидел такое решение. Просто думал, что можно сразу "заполнить ряд" в массиве.
 

beve

Осваивающий
Сообщения
104
Репутация
31
Suppir [?]
Просто думал, что можно сразу "заполнить ряд" в массиве.
Можно так "заполнить ряд", но это тоже самое решение, что описано несколько выше, только в ряд:
Код:
$avArray[1][5] = [["1","2","3","4","5"]]
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
beve
это предопределенная инициализация. в процессе выполнения скрипта каждый раз не получится вызывать инициализацию не потеряв при этом имеющиеся данные.
 

beve

Осваивающий
Сообщения
104
Репутация
31
Kaster [?]
это предопределенная инициализация. в процессе выполнения скрипта каждый раз не получится вызывать инициализацию не потеряв при этом имеющиеся данные.
Действительно. Да, теперь буду знать.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Suppir [?]
3. Вопрос, который представляет для меня трудную задачу:
У нас есть массив из строк следующего вида (как бы ключ и значение):
а > коза
а > коза
а > лошадь
б > собака
б > собака
б > коза
б > петух
c > зебра
c > зебра
c > слон
Необходимо для каждого уникального левого ключа вывести отсортированный по количеству список значений.
Т.е. скрипт должен вывести:
а > коза (2 шт.), лошадь (1 шт.)
б > собака (2 шт.), коза (1 шт.), петух (1 шт.)
с > зебра (2 шт.), слон (1 шт.)

Если вопрос еще актуальный (тема не отмечена решенной), то вот вариант решения :
Код:
#include <Array.au3>

Dim $avArray[10][2]=[['а','коза'],['а','коза'],['а','лошадь'],['б','собака'],['б','собака'], _ 
					 ['б','коза'],['б','петух'],['с','зебра'],['с','зебра'],['с','слон']]
_ArrayDisplay($avArray)

Dim $sStr='' , $sDefName='' , $sInd='' , $ii=1

$sList=GetSortLlist($avArray)
MsgBox (0,'$sList',$sList)

Func GetSortLlist($aArray)
   
   For $i=0 To UBound($aArray)-1
	  $ii += 1
	  If $sInd=$aArray[$i][0] Then 
		 If $sDefName <> $aArray[$i][1] Then
			If $sInd <>'' Then $ii=1
			; $sStr &=$aArray[$i][0] & ' < ' & $aArray[$i][1] & ' ( ' & $ii  & ' шт.) ' 
			$sStr &=' , ' & $aArray[$i][1] & ' ( ' & $ii  & ' шт.) '  ; Так будет точнее
		 EndIf  
	  Else
		 $sStr &=@CRLF & $aArray[$i][0] & ' < ' & $aArray[$i][1] & ' ( ' & $ii & ' шт.) ' 
		 $ii=1
	  EndIf
	 
	  $sDefName= $aArray[$i][1]
	  $sInd=$aArray[$i][0]  
   Next
   
   Return $sStr
EndFunc
 
Верх