2012-06-29 126 views
1

我想通過BigDecimal排序一個ArrayList和對磚牆來臨。我有一個類,看起來有點像這樣:Java收藏排序BigDecimal

public class deal implements Comparable<deal>{ 

protected BigDecimal bdPrice; 
protected int iQuantity; 
protected String sDealType; 
protected UUID dealUniqueID; 
protected int dealID; 
protected BigDecimal bdUnitPrice; 

public deal(){ 
    bdPrice   = new BigDecimal("0"); 
    bdUnitPrice  = new BigDecimal("0"); 
    iQuantity  = 1; 
    sDealType  = "Single item"; 
    dealUniqueID = UUID.randomUUID(); 
    dealID   = 0; 
} 

private void setUnitPrice(){ 
    this.bdUnitPrice = this.bdPrice.divide(new BigDecimal(this.iQuantity)); 
} 

public BigDecimal compareTo(deal oDeal) { 
    // TODO Auto-generated method stub 
    return bdUnitPrice.compareTo(oDeal.getUnitPrice()); 
} 

public boolean equals(deal oDeal) { 
    if (!(oDeal instanceof deal)) 
     return false; 
    deal oD = (deal) oDeal; 

    return this.bdUnitPrice.equals(oD.bdUnitPrice); 
} 
} 

和我的主要Android的活動是這樣的:

public class SupermarketDealsActivity extends Activity { 
private ArrayAdapter<deal> itemAdapter; 
private ListView lvDeals; 
private ArrayList<deal> itemArray; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    SetUpView(); 
} 

private void SetUpView(){ 
lvDeals      = (ListView)this.findViewById(R.id.listDeals); 

    itemArray     = new ArrayList<deal>(); 
    itemArray.clear(); 

    itemAdapter     = new ArrayAdapter<deal>(this, android.R.layout.simple_list_item_1,itemArray); 
    lvDeals.setAdapter(itemAdapter); 
} 

private void CreateADeal(int iQuantity, BigDecimal bdPrice) { 
    deal oDeal     = new deal(); 

    oDeal.setQuantity(iQuantity); 
    oDeal.setPrice(bdPrice); 

    CreateListDeals(oDeal); 
} 

private void CreateListDeals(deal oDeal){ 
    itemArray.add(oDeal); 
    Collections.sort(itemArray,Collections.reverseOrder()); 
    itemAdapter.notifyDataSetChanged(); 
} 
} 

在我的java類,我與我的compareTo方法說得到一個錯誤:

類型不匹配:不能從int轉換爲BigDecimal

我一定錯過了一些東西,它是什麼?

乾杯

+0

compareTo不應該返回BigDecimal。 –

+0

好吧,但我怎麼去比較和排序我的unitprices是BigDecimal格式...我把它轉換爲字符串? – Jarede

+0

不,您更改'compareTo'的返回類型以適合界面的正確簽名。 –

回答

4
public BigDecimal compareTo(deal oDeal) { 
    // TODO Auto-generated method stub 
    return bdUnitPrice.compareTo(oDeal.getUnitPrice()); 
} 

不匹配接口的任何簽名,也沒有的bdUnitPrice.compareTo返回類型相匹配。將其更改爲:

public int compareTo(deal oDeal) { 
    // TODO Auto-generated method stub 
    return bdUnitPrice.compareTo(oDeal.getUnitPrice()); 
} 

一對夫婦的其他事情,我應該提一下(從評論):

  1. 類的名稱應以大寫字母開頭。有一個「code conventions」文件說明你應該做的和其他事情。
  2. 你重寫equals - 你永遠不應該重寫equals,除非你也覆蓋hashCode - 否則,你將有噸的問題,如果你把這個類的對象變成一個HashSet,HashMap的或其他集合,它使用哈希值。
+1

另外不要忘記重寫「hashcode」方法,你應該隨時更改「.equals」方法。你會發現hashmaps和其他方式無法正常工作。 – Matt

+0

好點,@Matt。我喜歡向任何人推薦Java的一件事是安裝FindBugs插件,它會警告你這樣的事情。 –

+0

Eclipse可以爲您做的一件好事。有一個「生成hashCode()和equals()」的菜單項。您可以選擇在比較中使用的字段,它會爲您生成相應的以及.equals方法:) – Matt