2017-03-14 6 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

この「Quote」クラスは、「データ」の等価で何が言及されていますか?それはタイプミスですか? – 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

データオブジェクト内の "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. 
     } 
} 
関連する問題