2015-01-05 79 views
1

重複我有一個項目List名爲items並使用我複製此列表的Set複製對象複製到另一個集合的集合,而無需使用聚合操作

List<Item> items = new ArrayList<>(); 

    items.add(new Item("Suremen Body Spray", 1900, 45)); 
    items.add(new Item("HP wireless mouse", 5500, 5)); 
    items.add(new Item("UWS USB memory stick", 1900, 8)); 
    items.add(new Item("MTN modem", 1900, 45)); 
    items.add(new Item("MTN modem", 1900, 45)); 

    Collection<Item> noDups = new LinkedHashSet<Item>(items); //Copy items to noDups 

    //Print the new collection 
    noDups.stream() 
     .forEach(System.out::println); 

當我運行代碼,所有的項目如輸出中所示被複制到集合中。

enter image description here

不同的測試只用絃樂作品就好:

List<String> names = new ArrayList<>(); 

    names.add("Eugene Ciurana"); 
    names.add("Solid Snake"); 
    names.add("Optimus Prime"); 
    names.add("Cristiano Ronaldo"); 
    names.add("Cristiano Ronaldo"); 


    Collection<String> itemCollection = new HashSet<String>(names); 
    itemCollection.stream() 
      .forEach(System.out::println); 

enter image description here

我可以用什麼方法列表複製到一組不重複?是否有任何聚合操作,或者我必須編寫自定義方法?

回答

5

您需要在Item類中實現equalshashCode方法。

+0

唐不要確定散列碼不是強制性的。合約需要一個具有自定義「equals」的自定義哈希碼,如果合約被破壞,「HashSet」可能會遺漏重複。 – chrylis

+0

@chrylis是的,你是對的。謝謝。 –

+1

謝謝你,現在我知道比昨天做的更多的java。 :) –

1

只是想我添加一個答案來說明如何我終於做到了(當然使用亞當的建議)

我加的equalshashCode方法的實現我的項目類:

@Override 
public boolean equals(Object obj) { 
    if(!(obj instanceof Item)) { 
     return false; 
    } 
    if(obj == this) { 
     return true; 
    } 

    Item other = (Item)obj; 
    if(this.getName().equals(other.getName()) 
      && this.getPrice() == other.getPrice() 
      && this.getCountryOfProduction().equals(other.countryOfProduction)) { 
     return true; 
    } else { 
     return false; 
    } 

} 

public int hashCode() { 
    int hash = 3; 

    hash = 7 * hash + this.getName().hashCode(); 
    hash = 7 * hash + this.getCountryOfProduction().hashCode(); 
    hash = 7 * hash + Double.valueOf(this.getPrice()).hashCode(); 
    return hash; 

} 
+1

您可以使用Objects.hash()和Object.equals()(自Java 7以來)或Guava的[Objects](http://docs.guava-libraries.googlecode)來簡化/縮短上述代碼。 com/git/javadoc/com/google/common/base/Objects.html)或Apache Commons Lang的[HashCodeBuilder](http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/ lang3/builder/HashCodeBuilder.html)和[EqualsBuilder](http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html) –

+0

已注意,謝謝。 .. –

相關問題