Что нового

Поиск и подсчет повторяющихся (уникальных) строк в массиве

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Пробую подсчитать сколько раз какая строка повторяется в массиве. Кроме вот этого сообщения https://autoit-script.ru/threads/massivy-udalenie-dublikatov-iz-2d-massiva.17688/post-107584 ничего более подходящего не нашел. Но и с ним не получается. Понятно, что можно преобразовать в одномерный массив, но все равно не пойму как найти число повторов каждой строки
Массив примерно такой:
Код:
#include <Array.au3>

Global $From[0][2]

_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза1")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза1")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза1")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза2")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза2")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза2")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза3")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза3")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза3")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза4")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза4")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза4")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза4")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза5")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза5")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза5")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза1")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза1")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза1")
_ArrayAdd($From, "левая фраза1" & "|" & "правая фраза2")
_ArrayAdd($From, "левая фраза2" & "|" & "правая фраза2")
_ArrayAdd($From, "левая фраза3" & "|" & "правая фраза2")

_ArrayDisplay($From)

Нужно получить что-то типа такого:
Код:
левая фраза1 правая фраза1 повторяется столько-то раз
левая фраза1 правая фраза2 повторяется столько-то раз
левая фраза1 правая фраза3 повторяется столько-то раз
левая фраза1 правая фраза4 повторяется столько-то раз
................................
левая фраза3 правая фраза5 повторяется столько-то раз
 

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
Нужно получить что-то типа такого
Код:
#include <Array.au3>

Global $aFrom[0][2]

_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза1')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза1')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза1')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза2')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза2')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза2')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза3')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза3')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза3')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза4')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза4')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза4')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза4')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза5')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза5')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза5')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза1')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза1')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза1')
_ArrayAdd($aFrom,'левая фраза1'&'|'&'правая фраза2')
_ArrayAdd($aFrom,'левая фраза2'&'|'&'правая фраза2')
_ArrayAdd($aFrom,'левая фраза3'&'|'&'правая фраза2')

_ArrayDisplay($aFrom)

$aRez=__Array_2D_Double_Count($aFrom)
_ArrayDisplay($aRez)


Func __Array_2D_Double_Count(ByRef $aArray)
  Local $oDict=ObjCreate('Scripting.Dictionary')
  $oDict.RemoveAll
  $oDict.CompareMode=0
  For $i=0 To UBound($aArray)-1
    $sLine=$aArray[$i][0]&'|'&$aArray[$i][1]
    If $oDict.Exists($sLine)Then
      $oDict.Item($sLine)+=1
    Else
      $oDict.Add($sLine,1)
    EndIf
  Next
  Local $aString=$oDict.Keys,$aCount=$oDict.Items,$oDict=''
  Return __ArrayColConcatenate($aString,$aCount)
EndFunc

; Объединение 2-х 1D массивов в 2D массив (в первой колонке значения 1-го массива, во второй 2-го массива)
Func __ArrayColConcatenate(ByRef $avArray,ByRef $aArray)
  If Not IsArray($avArray)Or Not IsArray($aArray)Then Return
  Local $iCount1=UBound($avArray),$iCount2=UBound($aArray),$aRet[$iCount1][2]
  If $iCount1-$iCount2 Then Return ; $iCount1<>$iCount2
  For $i=0 To $iCount1-1
    $aRet[$i][0]=$avArray[$i]
    $aRet[$i][1]=$aArray[$i]
  Next
  Return $aRet
EndFunc
 
Верх