Crayl
Crayl

Reputation: 1911

Remove Duplicates from ArrayList filled with POJOs

I have an ArrayList filled POJOs and I want to remove all POJOs, which have a duplicate variable. This is the POJO:

public static class UrlStore {

    public String url;
    public String data;

    public UrlStore(String url) {
        this.url = url;
    }

    public void setData(String data) {
        this.data = data;
    }
}   

My way to remove duplicate "url"-variables in the ArrayList<UrlStore> is to iterate through the list and to remove those duplicates. It was said to me that I could simply use a Set to do this, but I can't figure out how to use it with an ArrayList containing POJOs. Or do you have even a better way?

Thanks for any suggestions!

Upvotes: 0

Views: 4744

Answers (4)

Batakj
Batakj

Reputation: 12743

package test.urlstore;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;


public class DuplicateDemo{

    public static void main(String[] args) throws Exception {
        List<UrlStore> urlStores = new ArrayList<UrlStore>();
        UrlStore usg = new UrlStore("google");
        UrlStore usy = new UrlStore("yahoo");
        UrlStore usb = new UrlStore("bing");
        UrlStore usa = new UrlStore("ask");
        UrlStore usd = new UrlStore("duckduckgo");


        usg.setData("mail");
        urlStores.add(usg);
        usg = new UrlStore("google");
        usg.setData("search");
        urlStores.add(usg);
        usg = new UrlStore("google");
        usg.setData("doc");
        urlStores.add(usg);
        usg = new UrlStore("google");
        usg.setData("search");
        urlStores.add(usg);
        usg = new UrlStore("google");
        usy.setData("search");
        urlStores.add(usy);
        usy.setData("search");
        urlStores.add(usy);
        usb.setData("search");
        urlStores.add(usb);
        usb.setData("search");
        urlStores.add(usb);
        usa.setData("search");
        urlStores.add(usa);
        usd.setData("search");
        urlStores.add(usd);

        System.out.println("before removing duplicates");
        // before removing duplicates
        for (Iterator iterator = urlStores.iterator(); iterator.hasNext();) {
            UrlStore urlStore = (UrlStore) iterator.next();
            System.out.println(urlStore.toString());
        }

        System.out.println("\n\nafter removing duplicates");
        //removing duplicates
         Set<UrlStore> uniqueUrlStores = new HashSet<UrlStore>(urlStores);

         //After removing duplicates
         for (Iterator iterator = uniqueUrlStores.iterator(); iterator.hasNext();) {
            UrlStore urlStore = (UrlStore) iterator.next();
            System.out.println(urlStore.toString());

        }

    }



    static class UrlStore {

        public String url;
        public String data;

        public UrlStore(String url) {
            this.url = url;
        }

        public void setData(String data) {
            this.data = data;
        }

        @Override
        public String toString() {
            return "UrlStore [url=" + url + ", data=" + data + "]";
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((data == null) ? 0 : data.hashCode());
            result = prime * result + ((url == null) ? 0 : url.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            UrlStore other = (UrlStore) obj;
            if (data == null) {
                if (other.data != null)
                    return false;
            } else if (!data.equals(other.data))
                return false;
            if (url == null) {
                if (other.url != null)
                    return false;
            } else if (!url.equals(other.url))
                return false;
            return true;
        }


    }   
}

Upvotes: 4

rocketboy
rocketboy

Reputation: 9741

Override hashCode() and equals() in your POJO and then:

List<URLStore>() list = //Your list;
Set<URLStore> set =new HashSet<URLStore>(list);

Upvotes: 2

AllTooSir
AllTooSir

Reputation: 49372

You can override the equals() and hashCode() methods in your POJO and pass the List<UrlStore> to the Set.

 List<UrlStore> listOfUrlStore = ......
 Set<UrlStore> foo = new HashSet<UrlStore>(listOfUrlStore);

I have used a simple HashSet here , the correct implementation of Set depends on your requirement. You can even convert the Set back to the List .

 listOfUrlStore.clear();
 listOfUrlStore.addAll(foo);   

Upvotes: 11

NiziL
NiziL

Reputation: 5140

Don't forget to override the equals method of your POJO. One this is done, you could use contains method of List to check if your object is in the list before add it.
For the Set, you don't have to use it with the list, it replace the list. You can populate a Set from a List with addAll(Collection c)

Upvotes: 1

Related Questions