【问题标题】:Java Collection sort BigDecimalJava 集合排序 BigDecimal
【发布时间】:2012-06-30 13:21:05
【问题描述】:

我正在尝试按 BigDecimal 对 ArrayList 进行排序,但遇到了难题。我有一个看起来有点像这样的类:

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 Activity 如下所示:

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

我一定是在路上错过了什么,那是什么?

干杯

【问题讨论】:

  • compareTo 不应返回 BigDecimal。
  • 好的,但是我如何按照 BigDecimal 格式的单价进行比较和排序...我是否将其转换为字符串?
  • 不,您更改 compareTo 的返回类型以适合接口的正确签名。
  • 您可能需要考虑SortedSet 实现(换句话说,TreeSet),并可能阅读用于标识符的正确大小写,例如在code conventions.
  • 凌晨 1 点脑子放个屁,你当然回来了……为 Paul Tomblin 欢呼。 @owlstead 我会检查一下 SortedSet。

标签: java android collections arraylist bigdecimal


【解决方案1】:
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());
}

我应该提到的其他几件事(来自 cmets):

  1. 类的名称应以大写字母开头。有一个“code conventions”文档说明了您应该做的事情和其他事情。
  2. 你覆盖了equals——你永远不应该覆盖equals,除非你也覆盖了hashCode——否则如果你把这个类的对象放入一个HashSet、HashMap或其他使用的集合中,你会遇到很多问题哈希。

【讨论】:

  • 另外不要忘记覆盖“hashcode”方法,您应该在任何时候更改“.equals”方法时这样做。你会发现 hashmaps 和 like 不能正常工作。
  • 好点,@Matt。我想向任何使用 Java 的人推荐的一件事是安装 FindBugs 插件,它会警告你类似的事情。
  • 这是 Eclipse 可以为您做的一件好事。 “Generate hashCode() and equals()”有一个菜单项。您选择要在比较中使用的字段,它会为您生成相应的 has 以及 .equals 方法:)