2016-03-19 6 views
1

Ich habe zwei Arrays, die nicht geordnet sind und unterschiedlich lang sein können, ich möchte ein neues Array erstellen, das nur die gemeinsamen Elemente enthält. Ich brauche eine Funktion wie newArray = commonElements (Array1, Array2) in LotusScript.LotusScript Gemeinsame Elemente in zwei Arrays

Ich habe mich nach einem Codebeispiel umgeschaut, konnte aber keins finden. Ich war in der Lage, dies zu schaffen, aber mit viel mehr Looping, als ich denke, sollte notwendig sein.

Können Sie mich auf eine Lösung hinweisen?

Antwort

1

Diese Funktion gibt die gemeinsamen Elemente beider Arrays:

Function commonElements(array1 As Variant, array2 As Variant) As Variant 
    Dim newArray() As Variant 
    Dim i As Integer 
    i=0 
    ForAll v In array1 
     If ArrayGetIndex(array2, v, 0) >= 0 Then 
      ReDim Preserve newArray(i) 
      newArray(i) = v 
      i = i + 1 
     End If 
    End ForAll 
    commonElements = newArray 
End Function 
+0

Eine kleine Änderung Wenn ArrayGetIndex (array2, v, 0) => 0 Then wenn das nullte Element in beiden Arrays enthalten ist, dann wird es verpasst, ansonsten wirkt es wie ein Zauber. Danke –

+0

Sie haben Recht, danke. Ich habe meine Antwort aktualisiert. –

+0

ArrayGetIndex unterscheidet sich leider von Instr. Instr gibt "0" zurück, wenn die Zeichenfolge nicht gefunden wird. ArrayGetIndex gibt NULL zurück. Die richtige Prüfung wäre: "Wenn nicht IsNull (ArrayGetIndex (Array2, v, 0) dann" –

1

Diese für String-Arrays arbeitet, habe ich nicht getestet mit Zahlen:

FullTrim(ArrayReplace(src1, ArrayReplace(src1, src2, Null), Null)) 
+0

Funktioniert auch mit Zahlen. Tolle Lösung! –

0

Ich habe Knut-Lösung verwendet, aber es brauchen um zwei Arrays unbekannter Länge vergleichen zu können. So verändert der Zyklus ForAll muss durch die längere der beiden Arrays:

Function commonElements(array1 As Variant, array2 As Variant) As Variant 
    Dim newArray() As Variant 
    Dim bigArray As Variant 
    Dim smallArray As Variant 
    If (UBound(Array1) => UBound(Array2)) Then 
     bigArray = array1 
     smallArray = array2 
    Else 
     bigArray = array2 
     smallarray = array1 
    End If 
    Dim i As Integer 
    i=0 
    ForAll v In bigArray 
     If ArrayGetIndex(smallArray, v, 0) >= 0 Then 
      ReDim Preserve newArray(i) 
      newArray(i) = v 
      i = i + 1 
     End If 
    End ForAll 
    commonElements = newArray 
End Function 
+0

Sie müssen es nicht tun, da Sie nur in gemeinsamen Elementen interessiert sind. Sie könnten Verwenden Sie es als Optimierung, aber dann würden Sie über SmallArray iterieren. Ich würde mit @ D.Bugger Lösung gehen. Leistung sollte ähnlich sein, aber Code ist viel kürzer ... –