Что нового

[Массивы] Как вывести только самые повторяющиеся значения в массиве.

vaf

Новичок
Сообщения
186
Репутация
2
Извиняюсь что задаю такой простой вопрос, но поиск по форуму ничего не дал.

Дан одномерный массив, со значениями типа "7;0","14;3" и т.д. (всего около 10000 элементов)
Нужно вывести только те элементы которые повторяются всех чаще. Скажем из 10000 элементов , только "3;5" и "4;6" повторяются всех больше, вот их и нужно вывести.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
#Include <Array.au3>

Local $aArray[9] = [ 4, 4, 4, 3, 5, 2, 2, 6, 9 ]
Local $aRet = _Sample( $aArray, 2 )

_ArrayDisplay( $aRet )

Func _Sample( $aArray, $iCount )
	Local $iUB, $iUB2, $Idx, $Jix, $aResult, $aRet
	; ---
	$iUB = UBound( $aArray )
	If $iCount > $iUB Then _
		$iCount = $iUB

	Local $aRet[$iCount]
	Local $aTmp[$iUB][2]
	For $Idx = 0 To $iUB - 1 Step 1
		If $aArray[$Idx] <> "" Then
			$aResult = _ArrayFindAll( $aArray, $aArray[$Idx] )

			$iUB2 = UBound( $aResult )

			$aTmp[$Idx][0] = $aArray[$Idx]
			$aTmp[$Idx][1] = $iUB2
			For $Jix = 0 To $iUB2 - 1 Step 1
				$aArray[$aResult[$Jix]] = ''
			Next
		EndIf
	Next
	_ArraySort( $aTmp, 1, 0, 0, 1 )
	; ---
	For $Idx = 0 To $iCount - 1 Step 1
		$aRet[$Idx] = $aTmp[$Idx][0]
	Next
	Return $aRet
EndFunc
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
Код:
Local $aRet = _Sample( $aArray, 2 )

2 как я понял это сколько самых частых повторений выводить ? а если этих повторений не 2 а 15, нельзя ли это как то автоматизировать ?
нужно все повторения вывести
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
vaf [?]
2 как я понял это сколько самых частых повторений выводить ? а если этих повторений не 2 а 15, нельзя ли это как то автоматизировать ?нужно все повторения вывести
Этой цифрой вы определяете сколько самых частых повторений вам нужно вывести, если же вам требуется вывести самое частое повторение(первое) и, если в X последующих столько же повторов - и их, то тогда так:

Код:
#Include <Array.au3>

Local $aArray[9] = [ 4, 4, 4, 3, 5, 2, 2, 6, 9 ]
Local $aRet = _Sample( $aArray )

_ArrayDisplay( $aRet )

Func _Sample( $aArray )
    Local $iUB, $iUB2, $Idx, $Jix, $aResult, $aRet
    ; ---
    $iUB = UBound( $aArray )

	Local $aRet[$iUB+1] = [1]
    Local $aTmp[$iUB][2]
    For $Idx = 0 To $iUB - 1 Step 1
        If $aArray[$Idx] <> "" Then
            $aResult = _ArrayFindAll( $aArray, $aArray[$Idx] )

            $iUB2 = UBound( $aResult )

            $aTmp[$Idx][0] = $aArray[$Idx]
            $aTmp[$Idx][1] = $iUB2
            For $Jix = 0 To $iUB2 - 1 Step 1
                $aArray[$aResult[$Jix]] = ''
            Next
        EndIf
    Next
    _ArraySort( $aTmp, 1, 0, 0, 1 )
    ; ---
	$aRet[1] = $aTmp[0][0]
	For $Idx = 1 To $iUB - 1 Step 1
		If $aTmp[$Idx][1] = $aTmp[0][1] Then
			$aRet[0] += 1
			$aRet[$aRet[0]] = $aTmp[$Idx][0]
		Else
			ExitLoop
		EndIf
	Next
	ReDim $aRet[$aRet[0]+1]

    Return $aRet
EndFunc


Первый элемент содержит количество всех элементов.

Для пояснения: Если все элементы будут уникальны - в результате будут все. (так как количество повторений у всех одинаково и соответствует первому)
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
Отлично, как раз то что нужно. Сам бы городил огород.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Не, чуваки, как ни тужьтесь, переплюнуть не получится...
http://autoit-script.ru/index.php/topic,11777.0.html
 
Верх