2011-12-16 6 views
2

Есть ли лучший способ написать этот компаратор? У меня есть эквивалент многомерного массива, где столбцы - Object. Фактические объекты: String и BigDecimal 99% времени. Я сортирую «строки» по заданному индексу столбца.Java-компаратор на многомерном массиве

Я хочу избежать экземпляра.

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

2

Так как String и BigDecimal являются Comparable s:

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

Если типы Колум не сопоставима, я бы реализовать отдельные компараторов и сделать класс колонка завод для правильного сравнения, который должен быть использован.

Смежные вопросы