开发者

Fastest way to detect duplicate numbers on array vb.net 2005

I have this project that let user inputs 5 different numbers from 1 to 50. But I want to validate it before saving to DB that开发者_运维问答 i will be 5 unique numbers. What's the best and fastest way to do this?


You can use HashSet(Of T) to check this:

Dim numbers As IEnumerable(Of Integer) = GetInputFromUser()
Dim hash As HashSet(Of Integer) = new HashSet(Of Integer)(numbers)

Dim unique As Boolean = hash.Count = numbers.Count()

This will be much more efficient than options requiring a sort + iteration.


Check this code

Private Function HasDuplicates(ByVal arr As Array) As Boolean
    For i As Integer = 0 To arr.Length - 1
        If Not arr(i) Is Nothing Then
            Dim l As Integer = Array.LastIndexOf(arr, arr(i))
            If l <> i Then Return True
        End If
    Next
    Return False
End Function


Reed Copsey's suggestion to use hash sets was a good one (I hadn't worked with the HashSet class before).

But I then discovered that the IEnumerable class offers an extension method called Distinct that copies the unique values from a source IEnumerable to a target IEnumerable.

Borrowing the first line of Reed's sample code, here's the new sample VB.NET code:

    Dim numbers As IEnumerable(Of Integer) = GetInputFromUser()
    Dim isUnique As Boolean = (numbers.Distinct.Count = numbers.Count)

The variable isUnique is True if the numbers IEnumerable contains no duplicate values, or False if it contains one or more duplicate values.


Put in an array, sort it and check if elements 1,2 2,3 3,4 and 4,5 are different (in a loop).


Pseudocode:

integer numbers[50]
zeroarray(numbers, 50)

integer count = 0;
while (count < 5)
{
   integer value = getinput()

   if (value >= 1 and value <= 50)
     if (numbers[value] = 0)
     {
        count = count + 1
        numbers[value] = 1
     }
     else
        reject duplicate
   else
     reject invalid
}


You can try this very simple method: Filtering Arrays using LINQ


To simplifiy lets say the user inputs 5 different numbers from 0 to 49.

You can create a Boolean Array IsUsed(49) with 50 elements.

Then when the user input the value iInputNum=30 you can set IsUsed(30)=TRUE. Next time, when the user input the second value iInputNum=7, you can set IsUsed(7)=TRUE In this way you can check in a very fast way if the number was already inserted.

if IsUsed(iInputNum) then
   'Skip the Input (put the right code here)
else
   'Accept the number
   IsUsed(iInputNum)=TRUE
   'save iInputNum in the database
end if

Do not forget to clear the array after inserting all 5 numbers. Remenber to put the right index in order to handle the number 1-50 (e not 0-49)


Here's an alternate solution, not sure how it compares, efficiency wise, to the other solutions, but it seems to work (uses LINQ).

Dim numbers As List<int> = getListOfNumbers()
Dim allUnique As Boolean = numbers.Distinct().Count() = numbers.Count()


Very late to the party, but what about something like this (C#, sorry)?

byte[] hits = new byte[51];
byte[] entries = new byte[] { 1, 12, 12, 32, 26, 49 };

foreach (var entry in entries)
{
    hits[entry]++;
}

The elements in the hits array are automatically initialized to 0. When the foreach loop is complete, hits will contain the occurrence count for every number in entries. If any is greater than 1, you have dupes.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜