Что нового

Как посчитать количество уникальных записей за один проход. Уже замучался...

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Всё равно способ c Assign намного быстрее любого другого способа :smile:
Нет смысла возиться с другими алгоритмами.

Единственная проблема этого способа, что его надо в отдельной функции реализовывать, чтобы по завершении функции всё, что было создано с помощью Assign, исчезло.

Бывает исключительная ситуация, когда в одной функции создаёшь переменные с помощью Assign, а в другой сверяешь. В этом случае придётся использовать исходный массив, чтобы стереть все переменные в первой функции перед тем, как начать присваивать.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
kzru_hunter
У Assign есть флаги! Почитайте. ;)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
kzru_hunter [?]
Единственная проблема этого способа, что его надо в отдельной функции реализовывать, чтобы по завершении функции всё, что было создано с помощью Assign, исчезло.
Код:
Assign ( "varname", "data" , 1) ; создаст локальные переменные
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Garrett сказал(а):
kzru_hunter [?]
Единственная проблема этого способа, что его надо в отдельной функции реализовывать, чтобы по завершении функции всё, что было создано с помощью Assign, исчезло.
Код:
Assign ( "varname", "data" , 1) ; создаст локальные переменные
Так я про это и указал, когда писал это предложение, т.к. не получится повторно выполнить этот способ вне функции, т.к. переменные уже будут существовать.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
kzru_hunter [?]
не получится повторно выполнить этот способ вне функции, т.к. переменные уже будут существовать.
Код:
_MyFunc()

If Not IsDeclared('a') Then MsgBox(0, Default, "Not found variable $a")

Assign('a', 10)
MsgBox(0, Default, $a)

Func _MyFunc()
    Assign('a', 1, 1)
    MsgBox(0, Default, $a)
EndFunc



Добавлено:
Сообщение автоматически объединено:

Или я вас не так понял?
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Я не пойму, к чему всё это? Я что-то не так написал?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
kzru_hunter [?]
Я не пойму, к чему всё это? Я что-то не так написал?
Может я чего-то не уловил? ;D
Приведите пример, пожалуйста, к вашим словам:
Бывает исключительная ситуация, когда в одной функции создаёшь переменные с помощью Assign, а в другой сверяешь. В этом случае придётся использовать исходный массив, чтобы стереть все переменные в первой функции перед тем, как начать присваивать.
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Например, по нажатию одной кнопки получаешь один список и отображаешь в программе (в добавок заносишь этот список в память с помощью Assign), затем по нажатию другой кнопки нужно получить другой список путём сравнения ещё одного списка с первым списком.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
kzru_hunter
То есть одним словом, вы хотите синхронизировать записи двух списков?!
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Garrett Нет, не синхронизировать, а отобрать, например, файлы, которых нет в первом списке.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
AZJIO
Если переменные существуют, то результат не корректный.

просто нужно добавить к имени уникальный префикс... например, как в исходном варианте kzru_hunter (_ip_), я их убрал намеренно - из соображений производительности
 
Автор
V

vaf

Новичок
Сообщения
189
Репутация
2
А как бы еще этот полученный массив отсортировать по кол-ву повторений IP адресов
_ArraySort вываливается в очень странную ошибку.
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Мой вариант. Кажется, очень быстро работает. Причем, строки в файле могут быть любыми.

Код:
$Timer = TimerInit()
$aList = StringSplit(FileRead('IP_List.txt'), @CRLF, 1)
$oDictionary = ObjCreate("Scripting.Dictionary")

;~ считаем, сколько раз повторяются уникальные строки
For $i = 1 To $aList[0]
	$oDictionary.Item ($aList[$i]) = $oDictionary.Item ($aList[$i]) + 1
Next	

ConsoleWrite(TimerDiff($Timer) & @LF)

;~ выводим результат
$out = FileOpen("результат.txt", 2)
For $vKey In $oDictionary
	if $vKey == "" Then
		ContinueLoop
	EndIf	
	FileWriteLine($out, $vKey & " = " & $oDictionary.Item($vKey))
Next

FileClose($out)
 
Верх