Finns det någon enkel funktion som man kan använda mot en array för att ta reda på om en viss siffra finns där någonstans? Jag vill ha ett true/false svar. Function ArrayTest(Minarray() as array,varde as integer) as Boolean <code> Här är en variant där man slipper loopa igenom arrayen, praktiskt om du har många array-items eller måste utföra proceduren väldigt många gånger. Varför använda join när det finns en filter funktion? "Här är en variant där man slipper loopa igenom arrayen, praktiskt om du har många array-items eller måste utföra proceduren väldigt många gånger." Filter-funktionen var ju rätt snitsig.Söka efter siffra i array
ex.
arrayen kanske ser ut såhär:
Array1(1,2,3,4,5)
jag frågar: finns det en trea i Array1?
det svaras: True (1)
jag frågar: finns det en sjua i Array1?
det svaras: False (0)
hoppas att någon förstår vad jag menar...Sv: Söka efter siffra i array
tmpArray = split(MinArray,",")
max = ubound(tmpArray) -1
arraytest = false
for a = 0 to max
if tmpArray(a) = varde then
arraytest = true
exit for
end if
next
End FunctionSv: Söka efter siffra i array
Function Exists(Data As Variuant, Find as Variant) As Boolean
Dim Index As long
For Index = LBound(Data) To UBound(Data)
If Data(Index) = Find Then
Exists = True
Exit For
End If
Next
End Function
</code>
Exempel:
<code>
Dim Data As Variant
Data = Array1(1,2,3,4,5)
If Exists(Data, 3) Then
Debug.Print "3 existerar"
Else
Debug.Print "3 Finns i sjön"
End If
If Exists(Data, 9) Then
Debug.Print "9 existerar"
Else
Debug.Print "9 Finns i sjön"
End If
</code>
Sv: Söka efter siffra i array
Om man nu vill leta efter något annat än siffror kan det vara bra att byta ut "," mot något annat, mer ovanligt, tecken i join-satsen.
<code>
Private Function Exists(Data As Variant, Find As Variant) As Boolean
If Data(LBound(Data)) = Find Or _
Data(UBound(Data)) = Find Then
Exists = True 'Första eller sista item innehöll rätt värde
Else
'Kolla resterande värden
Exists = InStr(1, Join(Data, ","), "," & Find & ",")
End If
End Function
</code>
/EggetSv: Söka efter siffra i array
<code>
Public Function Exists(Data As Variant, Find As Variant) As Boolean
Dim Result As Variant
Result = Filter(Data, Find, True, vbBinaryCompare)
Exists = UBound(Result) >= 0
End Function
</code>Sv: Söka efter siffra i array
Tvivlar iofs på att det skulle vara snabbare att söka efter en delsträng i en sträng än att loopa igenom en array...
Om ursprungsdatan är sorterad (och arrayen är någorlunda stor) så finns det snabbare metoden än att söka från början till slut. T ex (pseudokod) :
<code>
oldl=-1
low=lbound
high=ubound
l=(low+high)/2
Do
if (varde=array(l))
värde hittat, exit loop
elseif (värde<array(l))
high=l-1
elseif (värde>array(l))
low=l+1
end if
l=(low+high)/2
While low<>high
</code>
Algoritmen kollar hela tiden värdet mitt emellan low och high och flyttar dessa gränser beroende på om värdet är större eller mindre än det man söker och så testar man igen mittenvärdet...o s v...Sv: Söka efter siffra i array
Har inte gjort nån benchmarking på skillnaden mellan att loopa igenom en array eller att söka i en sträng, men jag kan göra lite tester och återkomma.
[EDIT]: Har gjort lite tester och kommit fram till följande inbördes rangordning:
1. Filter
2. Join
3. Loop
Detta visar sig tydligare när det börjar bli väldigt många items i en array, framförallt drar Filter-funktionen ifrån när det börjar gå upp mot 1.000.000 items i en array.
Join är något snabbare än att Loopa, men det är inte mycket. Det beror dessutom på om man bara loopar rakt upp och ner eller använder nån lite smartare algoritm.
/Egget