Что нового

[Массивы] Удаление дубликатов из 2D-массива

wisenlucky

Новичок
Сообщения
36
Репутация
0
Подскажите пожалуйста как удалить дубликаты из массива?
Код:
_ArrayUnique()
почему-то не работает корректно с 2-D массивом. Глаз уже замылен в поисках вариантов.
Массив:
Код:
dim $aArray[5][2]=[[412,0],[420,"."],[420,"."],[423,0],[425,3]]

Нужно удалить вторую (или третью) строку.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <Array.au3>

Dim $aArray[6][2]=[[412,0],[420,"."],[420,"."],[423,0],[423,0],[425,3]]

_ArrayDisplay($aArray)

For $i = UBound($aArray)-1 To 0 Step -1
	$iSearch1 = _ArraySearch($aArray, $aArray[$i][0], 0, 0, 0, 0, 1, 0)
	$iSearch2 = _ArraySearch($aArray, $aArray[$i][1], 0, 0, 0, 0, 1, 1)
	
	If $iSearch1 <> -1 And $iSearch2 <> -1 And $iSearch1 <> $i And $iSearch2 <> $i Then
		_ArrayDelete($aArray, $i)
	EndIf
Next

_ArrayDisplay($aArray)
 

madmasles

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

Opt('MustDeclareVars', 1)

Global $aArray[11][2] = [[10],[412, 0],[420, "."],[420, "."],[423, 0],[423, 0],[425, 3],['Вася'],['вася']], _
		$aArray_1 = $aArray, $aArray_2 = $aArray, $aArray_3[1][2], $aArray_4[5]

_Array2DUnique($aArray)
_ArrayDisplay($aArray, @extended & ' - ' & @error)

_Array2DUnique($aArray_1, 1, 1)
_ArrayDisplay($aArray_1, @extended & ' - ' & @error)

_Array2DUnique($aArray_2, 1.5)
_ArrayDisplay($aArray_2, @extended & ' - ' & @error)

_Array2DUnique($aArray_3, 1)
_ArrayDisplay($aArray_3, @extended & ' - ' & @error)

_Array2DUnique($aArray_4)
_ArrayDisplay($aArray_4, @extended & ' - ' & @error)

#cs
	Удалит в 2-мерном массиве все дублирующиеся строки (если дан $a_Array[n][q], то строка = $a_Array[i][0] & $a_Array[i][1] & ... & $a_Array[i][q - 1]).
	$a_Array		- 2-мерный массив.
	$i_Start		- индекс строки, начиная с которой идет проверка (только 0 или 1) (-1 = 0, Default = 0). По умолчанию 0.
	$i_Casesense	- 0 - не учитывать регистр, 1 - учитывать. По умолчанию 0.
	При успехе вернет  1, флаг @error = 0 и флаг @extended = кол-во удаленных (повторяющихся) строк.
	При неудаче вернет 0 и флаг @error =
	1				- $a_Array не 2-мерный массив.
	2				- $i_Start - некорректное значение.
	3				- Ошибка создания объекта Scripting.Dictionary
#ce
Func _Array2DUnique(ByRef $a_Array, $i_Start = 0, $i_Casesense = 0)
	Local $o_Dict, $i_Row, $i_Column, $a_TempArray = $a_Array, $i_Count, $s_Key

	If UBound($a_TempArray, 0) <> 2 Then Return SetError(1, 0, 0)
	$i_Row = UBound($a_TempArray, 1)
	$i_Start = Number($i_Start)
	Switch $i_Start
		Case 0, 1
		Case -1, Default
			$i_Start = 0
		Case Else
			Return SetError(2, 0, 0)
	EndSwitch
	If $i_Row - $i_Start < 1 Then Return SetError(2, 0, 0)
	$i_Count = $i_Start
	$i_Column = UBound($a_Array, 2)
	$o_Dict = ObjCreate('Scripting.Dictionary')
	If @error Then Return SetError(3, 0, 0)
	$o_Dict.CompareMode = Number(Not $i_Casesense)
	For $i = $i_Start To $i_Row - 1
		$s_Key = ''
		For $j = 0 To $i_Column - 1
			$s_Key &= $a_TempArray[$i][$j]
		Next
		If $o_Dict.Exists($s_Key) Then ContinueLoop
		$o_Dict.Item($s_Key)
		For $j = 0 To $i_Column - 1
			$a_Array[$i_Count][$j] = $a_TempArray[$i][$j]
		Next
		$i_Count += 1
	Next
	If $i_Count <> $i_Row Then ReDim $a_Array[$i_Count][$i_Column]
	Return SetExtended($i_Row - $i_Count, 1)
EndFunc   ;==>_Array2DUnique
 
Автор
W

wisenlucky

Новичок
Сообщения
36
Репутация
0
Спасибо большое за ответы, с первым вариантом - логика в целом понятна. Второй вариант буду копать :smile:
Интересно, что никто не предложил использовать функццию _ArrayUnique(). Я так понимаю он не только у меня не работает корректно.
 
Верх