2013-07-30 42 views
0

我有一个ArrayList填充了POJO,我想删除所有具有重复变量的POJO。这是POJO:删除填充了POJO的ArrayList中的重复项

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; 
    } 
} 

我的方式来删除重复的“URL” - 变量在ArrayList<UrlStore>是通过列表进行迭代,并删除这些重复。据我所知,我可以简单地使用Set来做到这一点,但我无法弄清楚如何在包含POJO的ArrayList中使用它。或者你有更好的方法?

感谢您的任何建议!

+3

添加'equals'和'hashCode'方法您的POJO ,那么只需从'List'(用'Set.addAll')创建一个'Set',它会自动删除重复项。 – Alex

+1

只需将列表转换为设置并享受即可。 –

回答

4
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; 
     } 


    } 
} 
+0

哇..非常感谢工作!有点toooo,但它完美的作品:) – Crayl

9

您可以覆盖POJO中的equals()hashCode()方法,并将List<UrlStore>传递给Set

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

我用一个简单的HashSet这里,正确执行Set取决于您的要求。您甚至可以将Set转换回List

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

不要忘记重写您POJO的equals方法。 这样做完成后,您可以使用contains方法List在添加之前检查您的对象是否在列表中。
对于Set,您不必使用它的清单,它取代的清单。您可以从ListaddAll(Collection c)

2

重载hashCode()和equals()在你的POJO,然后填充Set

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