2017-03-14 33 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. 
     } 
} 
相关问题