Java Comparator given the name of the property to compare

拈花ヽ惹草 提交于 2019-12-01 04:34:07

问题


My problem is this; I have to order a table of data. Each row of the table is an object (lets call it TableObject) stored in a List. Each column of data is a property of the class (usually a String).

I have to do the typical ordering of data when the user clicks on any column. So I thought about changing the List to a TreeSet and implementing Comparator in my TableObject.

The problem comes when I try to reorder the TreeSet. The compare is fairly easy at first (cheeking for exceptions in parseInt have been omitted):

   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;

    }

But when I have to reorder by the text of the data or by other dozens of data that the TableObject has I have a problem. I do not want to create dozens of compare functions, each for one. I prefer not to use a switch (or a chain of ifs) to decide how to compare the object.

Is there any way to do this in some way (like Reflexive), that doesn't imply that I will write like hundreds of lines of nearly the same code?

Thanks for all!


回答1:


Bean Comparator should work.




回答2:


What you could do is make the comparator take a String representing the name of the parameter to sort by in its constructor.

Then you could use reflection to sort by the given parameter.

The following code is very dirty. But I think it illustrates the gist of what you would need to do.

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");
        }
    }
}



回答3:


Yes, you could use the reflection API, to get the content of a field based on it's name.

See Field class and especially the Field.get method.

(I wouldn't recommend it though, as reflection is not designed for this type of task.)



来源:https://stackoverflow.com/questions/4135998/java-comparator-given-the-name-of-the-property-to-compare

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!