Java Comparator给出要比较的属性的名称

时间:2010-11-09 16:25:42

标签: java compare

我的问题是这个;我必须订购一张数据表。表的每一行都是存储在List中的对象(让我们称之为TableObject)。每列数据都是类的属性(通常是String)。

当用户点击任何列时,我必须执行典型的数据排序。所以我考虑将List更改为TreeSet并在TableObject中实现Comparator。

当我尝试重新排序TreeSet时出现问题。比较起初相当容易(已经省略了对parseInt中的异常的监督):

   public int compare(TableObject to1, TableObject to2){
        TableObject t1 = to1;
        TableObject t2 = to2;

        int result = 1;

        if(Integer.parseInt(t1.getId()) == Integer.parseInt(t2.getId())){result=0;}
        if(Integer.parseInt(t1.getId()) < Integer.parseInt(t2.getId())){result=-1;}

        return result;

    }

但是当我必须通过数据文本或TableObject所具有的其他数十个数据重新排序时,我遇到了问题。 我不想创建几十个比较函数,每个函数都是一个。我不想使用开关(或ifs链)来决定如何比较对象。

有没有办法以某种方式做到这一点(比如Reflexive),这并不意味着我会写几百行几乎相同的代码?

谢谢大家!

3 个答案:

答案 0 :(得分:5)

Bean Comparator应该有用。

答案 1 :(得分:3)

你可以做的是让比较器取一个String表示要在其构造函数中排序的参数名称。

然后你可以使用反射按给定参数排序。

以下代码非常脏。但我认为这说明了你需要做的事情。

public class FieldComparator<T> implements Comparator<T> {
    String fieldName;

    public FieldComparator(String fieldName){
        this.fieldName = fieldName;
    }

    @Override
    public int compare(T o1, T o2) {
        Field toCompare = o1.getClass().getField(fieldName);
        Object v1 = toCompare.get(o1);
        Object v2 = toCompare.get(o2);
        if (v1 instanceof Comparable<?> && v2 instanceof Comparable<?>){
            Comparable c1 = (Comparable)v1;
            Comparable c2 = (Comparable)v2;
            return c1.compareTo(c2);
        }else{
            throw new Exception("Counld not compare by field");
        }
    }
}

答案 2 :(得分:1)

是的,您可以使用reflection API,根据其名称获取字段的内容。

请参阅Field课程,尤其是Field.get方法。

(我不推荐它,因为反射不是为这类任务设计的。)