2011-12-16 114 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

如果科拉姆類型沒有可比性,我將實現獨立的比較,使列類應使用正確的比較器的工廠。