Что нового

[Массивы] удалить из массива все слова, которые встречаются один (или к примеру два) раза

vaf

Новичок
Сообщения
189
Репутация
2
Доброго времени суток. У меня вопрос.
Дан массив. К примеру: вася,петя,иван,владимир,вася,вася,владимир
Нужно удалить из массива все слова, которые встречаются один (или к примеру два) раза,
после этого удалить повторяющиеся значения (ну это понятно через _ArrayUnique) а вот с первым у меня мысли только через циклы, но как бы сделать по грамотнее ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
... :scratch:
А тебе ответов в этой теме мало???
http://autoit-script.ru/index.php/topic,11777.msg76889.html#msg76889
:shok:
Там дописать то нужно самую малость!
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
vaf
Посмотри это Compare strings. Там исходник и два варианта функций, один с Assign, другой с Scripting.Dictionary. Скомпилированная программа использует Assign. Если нужна скомпилированная с Scripting.Dictionary, то скачай временную версию. Разница в том что с Scripting.Dictionary поддерживает учёт регистр и хотелось бы добавить параметр "не учитывать регистр", в итоге Scripting.Dictionary расширяет возможности. По скорости работы почти одинаково. Функция _ArrayUnique заметно проигрывает в этих случаях.
На счёт разделителя, там есть возможность указать его.

Пример.
Код:
#include <Array.au3>

$sText1 = _CountingStringUnique(FileRead(@ScriptDir & '\тест1.txt'))
MsgBox(0, 'Сообщение', $sText1)


Func _CountingStringUnique($sText, $sep = @CRLF, $sep2 = '', $all = 1)
	Local $i, $k, $aText
	If $all And $sep2 == '' Then $sep2 = $sep

	$aText = StringSplit($sText, $sep, $all + 2)
	Local $oSD = ObjCreate("Scripting.Dictionary")
	$oSD.CompareMode = 0
	For $i In $aText
		$oSD.Item($i) = $oSD.Item($i) + 1
	Next
	$aText = $oSD.Keys()
	$k = 0
	$sText = ''
	For $i In $aText
		If Not $i Then ContinueLoop
		If $oSD.Item($i) = 2 Then ContinueLoop
		$sText &= $oSD.Item($i) & @TAB & $i & $sep2
		$k += 1
	Next
	If $k = 0 Then Return SetError(2, 0, '')
	Return SetError(0, $k, StringTrimRight($sText, StringLen($sep2)))
EndFunc   ;==>_CountingStringUnique


Добавил в функцию всего одну строку
Код:
If $oSD.Item($i) = 2 Then ContinueLoop
 
Верх