2017-03-14 37 views
1

我有一些實體類我如何刪除和更新TreeSet中的排序元素?

class Data{ 
    private String quoteID; 
    private String bidOrOffer; 
    private float price; 
    private long volume; 
    private Date createDate; 

    public Data(String quoteID, String bidOrOffer, float price, long volume) { 
     this.quoteID = quoteID; 
     this.bidOrOffer = bidOrOffer; 
     this.price = price; 
     this.volume = volume; 
     createDate = new Date(); 
    } 

    @Override 
    public int hashCode() { 
     int hash = 5; 
     hash = 13 * hash + Objects.hashCode(this.quoteID); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final Data other = (Data) obj; 
     if (!Objects.equals(this.quoteID, other.quoteID)) { 
      return false; 
     } 
     return true; 
    } 
} 

,我推一些內容到TreeSet絲毫特殊訂單

Comparator<Data> offerOrder = (Data o1, Data o2) -> { 
    if(o1.equals(o2)) 
     return 0;  
    if(o1.getPrice() == o2.getPrice() 
      && o1.getVolume() == o2.getVolume()){ 
     return o1.getCreateDate().after(o2.getCreateDate())? 1:-1; 
    } 
    if(o1.getPrice() == o2.getPrice()){ 
     return o1.getVolume() > o2.getVolume()? 1:-1; 
    } 
    if(o1.getPrice() > o2.getPrice()) 
     return 1; 
    else 
     return -1; 
}; 


Set<Data> treeSet = new TreeSet<>(offerOrder); 
treeSet.add(new Data("Q1", "OFFER", 1.32f, 1000000)); 
treeSet.add(new Data("Q6", "OFFER", 1.32f, 1000000)); 
treeSet.add(new Data("Q7", "OFFER", 1.33f, 200000)); 

通過quoteID 但如果我這個任務是刪除和更新一些數據的主要目標這樣做

treeSet.contains(new Data("Q7", "OFFER", 0, 0)); //return false 

此後方法刪除不起作用了。

任何想法?

+0

這是什麼'引用'類中提到'數據'的平等?這是一個錯字嗎? – Eran

回答

1

您應該注意更改Comparator<Data> offerOrder的實現,因爲該實現不允許通過treeSet.contains找到要查找的對象。

例如你的情況:

Comparator<Data> offerOrder = (Data o1, Data o2) -> { 
    return o1.quoteID.compareTo(o2.quoteID); 
    }; 

,然後返回true

treeSet.contains(new Data("Q7", "OFFER", 0, 0)); //return true 

也有在你的equals方法錯誤:

final Quote other = (Quote) obj; 
    if (!Objects.equals(this.quoteID, other.quoteID)) { 
     return false; 
    } 

你應該使用:

if (!this.quoteID.equals(other.quoteID)) { 
     return false; 
    } 

並且因爲quoteIDString不清楚什麼是Quote類。

我建議改變用這種方式hashCodeequals方法:

@Override 
public int hashCode() 
{ 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((quoteID == null) ? 0 : quoteID.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; 
    Data other = (Data) obj; 
    if (quoteID == null) { 
    if (other.quoteID != null) 
     return false; 
    } else if (!quoteID.equals(other.quoteID)) 
    return false; 
    return true; 
} 
2

當插入「Q7」的比較中比較「Q1」返回1。 如果您現在想用new Data("Q7", "OFFER", 0, 0)刪除「Q7」,比較器將返回-1。 所以樹的「錯誤」路徑的孩子接下來比較。

treeSet.contains(new Data("Q7", "OFFER", 2, 0))將返回true(與「Q1」返回1相比)。

0

您不能在Data對象中搜索「quoteID」。您必須迭代每個Data對象並匹配「quoteID」。

Iterator<Data> iterator = treeSet.iterator(); 
while(iterator.hasNext()){   
     Data dataobj = iterator.next(); 
     String qID = dataobj.quoteID; 
     if(qID.equals("Q7")){ 
      //write your code. 
     } 
} 
相關問題