Solved

finding duplicates in arraylist

Posted on 2007-12-01
4
2,643 Views
Last Modified: 2011-10-03
I am using the method below to find the duplicates in an array list and remove them.  It works, but only finds the first duplicate.  So for instance if the list is "1", "1","1","2","2","3", the unique list is 1, 1, 2, 3.  Anyone know why that is?
   public void topTalkers()
        {

            int i, j, k;

            ArrayList arr = new ArrayList();
            string[] unTemp = new string[recordNum];
           
            for (int x = 0; x < recordNum - 1; x++)
            {
                unTemp[x]= srcIP[x];
            }
            for (k = 0; k < unTemp.Length-1; k++)
            {
                arr.Add(unTemp[k].ToString());
            }
            arr.Sort();
 

            for (i = 0; i < arr.Count - 1; i++)
            {
                for (j = i + 1; j < arr.Count; j++)
                {
                    if (arr[i].Equals(arr[j]))
                    {
                        MessageBox.Show("duplicate removed: " + arr[j]);
                        arr.RemoveAt(j);
                    }
                }
            }

            for (k = 0; k < arr.Count; k++)
            {
                MessageBox.Show(arr[k].ToString());

            }
        }

0
Comment
Question by:aareedy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
4 Comments
 
LVL 55

Accepted Solution

by:
Jaime Olivares earned 125 total points
ID: 20389304
try with:
for (i = 0; i < arr.Count - 1; i++)
            {
                for (j = i + 1; j < arr.Count;)
                {
                    if (arr[i].Equals(arr[j]))
                    {
                        MessageBox.Show("duplicate removed: " + arr[j]);
                        arr.RemoveAt(j);
                    }
                    else
                        j+;
                }
            }

0
 
LVL 29

Expert Comment

by:Göran Andersson
ID: 20389399
As the list is sorted, you can reduce the comparisons you do drastically. You don't have to compare every item to all the other items, you only have to compare the items that are next to each other:
for (int i = 1; i < arr.Count;) {
   if (arr[i-1].Equals(arr[i]) {
      MessageBox.Show("Duplicate removed: " + arr[i].ToString());
      arr.RemoveAt(i);
   } else {
      i++;
   }
}

Open in new window

0
 
LVL 40

Expert Comment

by:evilrix
ID: 20389407
>> Anyone know why that is?
The problem is being caused by you removing the dup, which shuffles everything after it down one but then you increment j so you are missing the next one.

jaime_olivares suggested fix should over-come this.

Example: -

 0   1   2   3   4   5
"1","1","1","2","2","3", 
i=0, j=1 
arr[i] = 1
arr[j] = 1
dup found and removed
j++
 
 0   1   2   3   4   5
"1","1","2","2","3", 
i=0, j=2
arr[i] = 1
arr[j] = 2
 
dup missed

Open in new window

0
 

Author Closing Comment

by:aareedy
ID: 31412134
Thanks! Great help!
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this post we will learn different types of Android Layout and some basics of an Android App.
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
An introduction to basic programming syntax in Java by creating a simple program. Viewers can follow the tutorial as they create their first class in Java. Definitions and explanations about each element are given to help prepare viewers for future …
Starting up a Project

623 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question