Что нового

Подсчет количества значений из одного массива в другом

cheslav

Новичок
Сообщения
18
Репутация
0
Версия AutoIt: 3.
v3.3.10.0
Описание:
Добрый день. Есть два двумерных массива

Первый
имя счетчик
имя1 0
имя2 0
имя3 0
......
имяn 0

и второй
кол-во eд.изм имя
10 кг имя1
20 шт имя2
5 кг имя1
56 кг имя1
...... .... ......
12 шт имяn

Необходимо посчитать количество повторений каждого из имен из первого массива во втором и занести в колонку "счетчик" первого
Минимум кода приветствуется )
Заранее спасибо.

Примечания:
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Код:
#include <Array.au3>

Dim $aOne[3][2] = [ _
["имя 1", 0], _
["имя 2", 0], _
["имя 3", 0]]

Dim $aTwo[4][3] = [ _
[10, "кг", "имя 1"], _
[20, "шт", "имя 2"], _
[5, "кг", "имя 1"], _
[56, "кг", "имя 1"]]

For $i = 0 To UBound($aOne)-1
   $iStart = -1
   Do
	  $iStart = _ArraySearch($aTwo, $aOne[$i][0], $iStart+1, 0, 0, 0, 1, 2)
	  If Not @error Then $aOne[$i][1] += 1
   Until @error
Next

_ArrayDisplay($aOne)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
cheslav,
Мой вариант.
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aCount[1], $aBase[1]

_CreateRandomArrays($aCount, $aBase)
_ArrayDisplay($aCount, '$aCount')
_ArrayDisplay($aBase, '$aBase')

_Count($aCount, $aBase)
_ArrayDisplay($aCount, '$aCount')
_ArraySort($aCount, 1, 1, 0, 1)
_ArrayDisplay($aCount, '$aCount sort')

Func _Count(ByRef $a_Count, $a_Base, $i_ColumnBase = 2)
	Local $o_Dict = ObjCreate('Scripting.Dictionary')

	For $i = 1 To $a_Count[0][0]
		If Not $o_Dict.Exists($a_Count[$i][0]) Then
			$o_Dict.Add($a_Count[$i][0], $i)
		EndIf
		$a_Count[$i][1] = 0
	Next
	For $i = 1 To $a_Base[0][0]
		If $o_Dict.Exists($a_Base[$i][$i_ColumnBase]) Then
			$a_Count[$o_Dict.Item($a_Base[$i][$i_ColumnBase])][1] += 1
		Else
			$a_Count[0][0] += 1
			ReDim $a_Count[$a_Count[0][0] + 1][2]
			$a_Count[$a_Count[0][0]][0] = $a_Base[$i][$i_ColumnBase]
			For $j = 1 To $a_Count[0][0]
				$a_Count[$j][1] = 0
			Next
			_Count($a_Count, $a_Base)
		EndIf
	Next
EndFunc   ;==>_Count

Func _CreateRandomArrays(ByRef $a_Count, ByRef $a_Base, $i_NumCount = 20, $i_NumBase = 500)
	Local $a_Tmp[2] = ['шт', 'кг']

	ReDim $a_Count[$i_NumCount + 1][2]
	$a_Count[0][0] = $i_NumCount
	ReDim $a_Base[$i_NumBase + 1][3]
	$a_Base[0][0] = $i_NumBase
	For $i = 1 To $a_Count[0][0]
		$a_Count[$i][0] = 'имя' & $i
		$a_Count[$i][1] = 0
	Next
	For $i = 1 To $a_Base[0][0]
		$a_Base[$i][0] = Random(2, 20, 1)
		$a_Base[$i][1] = $a_Tmp[Random(0, 1, 1)]
		$a_Base[$i][2] = $a_Count[Random(1, $a_Count[0][0], 1)][0]
	Next
EndFunc   ;==>_CreateRandomArrays
 
Автор
C

cheslav

Новичок
Сообщения
18
Репутация
0
madmasles сказал(а):
cheslav,
Мой вариант.
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aCount[1], $aBase[1]

_CreateRandomArrays($aCount, $aBase)
_ArrayDisplay($aCount, '$aCount')
_ArrayDisplay($aBase, '$aBase')

_Count($aCount, $aBase)
_ArrayDisplay($aCount, '$aCount')
_ArraySort($aCount, 1, 1, 0, 1)
_ArrayDisplay($aCount, '$aCount sort')

Func _Count(ByRef $a_Count, $a_Base, $i_ColumnBase = 2)
	Local $o_Dict = ObjCreate('Scripting.Dictionary')

	For $i = 1 To $a_Count[0][0]
		If Not $o_Dict.Exists($a_Count[$i][0]) Then
			$o_Dict.Add($a_Count[$i][0], $i)
		EndIf
		$a_Count[$i][1] = 0
	Next
	For $i = 1 To $a_Base[0][0]
		If $o_Dict.Exists($a_Base[$i][$i_ColumnBase]) Then
			$a_Count[$o_Dict.Item($a_Base[$i][$i_ColumnBase])][1] += 1
		Else
			$a_Count[0][0] += 1
			ReDim $a_Count[$a_Count[0][0] + 1][2]
			$a_Count[$a_Count[0][0]][0] = $a_Base[$i][$i_ColumnBase]
			For $j = 1 To $a_Count[0][0]
				$a_Count[$j][1] = 0
			Next
			_Count($a_Count, $a_Base)
		EndIf
	Next
EndFunc   ;==>_Count

Func _CreateRandomArrays(ByRef $a_Count, ByRef $a_Base, $i_NumCount = 20, $i_NumBase = 500)
	Local $a_Tmp[2] = ['шт', 'кг']

	ReDim $a_Count[$i_NumCount + 1][2]
	$a_Count[0][0] = $i_NumCount
	ReDim $a_Base[$i_NumBase + 1][3]
	$a_Base[0][0] = $i_NumBase
	For $i = 1 To $a_Count[0][0]
		$a_Count[$i][0] = 'имя' & $i
		$a_Count[$i][1] = 0
	Next
	For $i = 1 To $a_Base[0][0]
		$a_Base[$i][0] = Random(2, 20, 1)
		$a_Base[$i][1] = $a_Tmp[Random(0, 1, 1)]
		$a_Base[$i][2] = $a_Count[Random(1, $a_Count[0][0], 1)][0]
	Next
EndFunc   ;==>_CreateRandomArrays

Спасибо, я уже оформил все на примере mef-t. Но будем иметь ввиду и Ваш....про запас
 
Верх