RomanV
(RomanV)
May 8, 2016, 5:00am
1
Hey guys… Can anyone help me with this please ?
I have a Myarray(3) and I need to check it for duplicates.
So, I must compare 0 to 1, 2, 3.
Then, 1 to 0, 2, 3,
then, 2 to 0, 1, 3,
and at last, 3 to 0, 1, 2.
Right ?
What’s the right/best way to do it ?
You only need an algorithm if this will ever be applied to a larger array.
What you typed is good enough to do it for a 4 element array
if M(0) = M(1) or M(0) = M(2) or M(0) = M(3) then…
if M(1) = M(2) or M(1) = M(3) then…
if M(2) = M(3) then…
You dont need to check that M(3) = M(1) as you did that on the first row.
For bigger numbers of array elements, you need nested loops
For x = 0 to 2
for y = 1 to 3
if M(x) = M(y)
Homework, I guess.
RomanV
(RomanV)
May 8, 2016, 5:44am
4
Just one more thing…
If I’d use the nested loops approach in the case of a larger array… Would I not get a false positive when (for example) x=1 and y=1. Comparing the same Id"s would get me duplicated items… Right?
For x = 0 to 2
for y = 1 to 3
if M(x) = M(y)
DaveS
(DaveS)
May 8, 2016, 5:56am
5
for x=0 to m.ubound-1
for y=x+1 to m.ubound
It doesn’t matter for small datasets but for larger unsorted datasets, I prefer using a dictionary.
To remove duplicates:
[code] Dim d As New Dictionary
For Each s As String In myArray
d.Value(s) = True
Next s
Dim uniqueArray() As String
For Each v As Variant In d.keys
uniqueArray.Append(v)
Next v[/code]
…or just count the duplicates:
Dim dupCnt As Integer
Dim d As New Dictionary
For Each s As String In myArray
If d.HasKey(s) Then dupCnt = dupCnt + 1
d.value(s) = True
Next s
DaveS
(DaveS)
May 8, 2016, 1:20pm
7
use of a dictionary might not suit the purpose, as you then lose control over the original physcial location, which may or may not be important