компаратор Java на многомерном массиве - PullRequest
2 голосов
/ 16 декабря 2011

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

Я хочу избежать 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");
        }
    }

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

Поскольку String и BigDecimal равны Comparable с:

return ((Comparable)o1).compareTo(o2);
1 голос
/ 16 декабря 2011

Я думаю, что поскольку вы зависите только от типа Comparable, вы можете переписать его как:

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 голосов
/ 16 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...