2011-12-16 115 views
2

有没有更好的方法来编写这个比较器?我有一个等值的多维数组,其中列是Object's。 99%的实际对象是StringBigDecimal。我在给定的列索引上排序“行”。多维阵列上的java比较器

我想避免instanceof。

protected static class MyComparator implements Comparator<DataRow> { 
    private int idx; 

    public MyComparator(int idx) { 
     this.idx = idx; 
    } 

    @Override 
    public int compare(DataRow r1, DataRow r2) { 
     Object o1 = r1.getColumns()[idx]; 
     Object o2 = r2.getColumns()[idx]; 
     if (o1 instanceof String){ 
      return ((String)o1).compareTo((String)o2); 
     }else if (o1 instanceof BigDecimal){ 
      return ((BigDecimal)o1).compareTo((BigDecimal)o2); 
     }else{ 
      throw new UnsupportedOperationException("comparison cannot be performed"); 
     } 
    } 

回答

1

我想,因为你只取决于类型可比你可以把它改写为:

public int compare(DataRow r1, DataRow r2) { 
     Comparable o1 = (Comparable) r1.getColumns()[idx]; 
     Comparable o2 = (Comparable) r2.getColumns()[idx]; 
     return o1.compareTo(o2); 
} 

如果你仔细填写您不应该面对UnsupportedOperationException异常情况表。

+0

我将不得不通过许多测试来运行我的应用程序,以查看数据是否兼容。到目前为止,单元测试使用这种方法保持稳定:))我扔了一个Integer,并且工作得很好。 – Elijah 2011-12-16 20:09:48

2

由于两个StringBigDecimalComparable S:

return ((Comparable)o1).compareTo(o2); 
0

如果科拉姆类型没有可比性,我将实现独立的比较,使列类应使用正确的比较器的工厂。