Что нового

Как неповторять ссылку в массиве?

Pennon

Новичок
Сообщения
45
Репутация
0
Здравствуйте, собираю в массив ссылки, получается одна ссылка 2 раза. Как взять одну ссылку один раз?
Код:
#include <IE.au3>
#include <Array.au3>

HotKeySet('{Esc}', '_Exit')
$sUrl = 'https://forexdengi.com/forums/190-zdorove'
Global $sMyString = "newpost"
Global $oIE = _IECreate()
;Func _FuncName($sURL, $sMyString)
    Local $oLinks, $aResult[1], $sText, $hFile

    _IENavigate($oIE, $sURL)
    $oLinks = _IELinkGetCollection($oIE)

For $i = 0 To 1
  For $oLink in $oLinks
    If StringInStr($oLink.href, $sMyString) Then
        $aResult[0] = UBound($aResult)
        _ArrayAdd($aResult, $oLink.href)
    EndIf
  Next
Next

_ArrayDisplay($aResult) ;
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Зачем вам цикл "For $i = 0 To 1"?

Для уникальности значений, вы можете использовать ассоциативный массив
Код:
;~ AutoIt Version: 3.3.14.5
#include <IE.au3>
#include <Array.au3>

;~ HotKeySet('{Esc}', '_Exit')
$sUrl = 'https://forexdengi.com/forums/190-zdorove'
Global $sMyString = "newpost"
Global $oIE = _IECreate()
;Func _FuncName($sURL, $sMyString)
Local $oLinks, $sText, $hFile

_IENavigate($oIE, $sUrl)
$oLinks = _IELinkGetCollection($oIE)

Local $oDict = ObjCreate("Scripting.Dictionary")
$oDict.CompareMode = 1
For $oLink In $oLinks
	If StringInStr($oLink.href, $sMyString) Then $oDict.Item($oLink.href)
Next

Local $aResult = $oDict.Keys
_ArrayDisplay($aResult)
 
Автор
P

Pennon

Новичок
Сообщения
45
Репутация
0
Tempo
Как первую ссылку не записывать?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Pennon
Проще будет удалить её из конечного результата или например записать вместо неё кол-во элементов массива
Код:
;~ AutoIt Version: 3.3.14.5
#include <IE.au3>
#include <Array.au3>

;~ HotKeySet('{Esc}', '_Exit')
$sUrl = 'https://forexdengi.com/forums/190-zdorove'
Global $sMyString = "newpost"
Global $oIE = _IECreate()
;Func _FuncName($sURL, $sMyString)
Local $oLinks, $sText, $hFile

_IENavigate($oIE, $sUrl)
$oLinks = _IELinkGetCollection($oIE)

Local $oDict = ObjCreate("Scripting.Dictionary")
$oDict.CompareMode = 1
For $oLink In $oLinks
	If StringInStr($oLink.href, $sMyString) Then $oDict.Item($oLink.href)
Next

Local $aResult = $oDict.Keys
$aResult[0] = $oDict.Count - 1
_ArrayDisplay($aResult)


Но если вы очень хотите пропустить определенное кол-во элементов, можно сделать так
Код:
;~ AutoIt Version: 3.3.14.5
#include <IE.au3>
#include <Array.au3>

;~ HotKeySet('{Esc}', '_Exit')
$sUrl = 'https://forexdengi.com/forums/190-zdorove'
Global $sMyString = "newpost"
Global $oIE = _IECreate()
;Func _FuncName($sURL, $sMyString)
Local $oLinks, $sText, $hFile

_IENavigate($oIE, $sUrl)
$oLinks = _IELinkGetCollection($oIE)

Local $oDict = ObjCreate("Scripting.Dictionary"), $iSkipCount = -2
$oDict.CompareMode = 1
For $oLink In $oLinks
	If StringInStr($oLink.href, $sMyString) Then
		If Not $iSkipCount Then
			$oDict.Item($oLink.href)
		Else
			$iSkipCount += 1
		EndIf
	EndIf
Next

Local $aResult = $oDict.Keys
_ArrayDisplay($aResult)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
OffTopic:
Tempo [?]
_ArrayUnique использует тот же Scripting.Dictionary
Верно. Только нет необходимости самостоятельно с ним разбираться - всё уже сделано за нас.

Зачем промежуточное звено в виде массива
Я думаю, это не та задача, в которой лишний массив повлияет на скорость выполнения или приведёт к недостатку памяти. Тем более, что его можно переписать самим собой
Код:
$aResult = _ArrayUnique($aResult, 0, 0, 0, 0)
_ArrayDelete($aResult, 1)
$aResult[0] -= 1
 
Верх