Android中的Bean比较器

时间:2016-03-02 23:27:51

标签: java android

我试图通过该对象的属性对对象列表进行排序。例如,名为" person"的列表,名为" person"还有一些属性,如" age"," length"和"母亲语言"。我想按年龄,长度或母语对这个列表进行排序。通常你会这样做:

public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person person1, Person person2) {
    return person1.getName().compareTo(person2.getName());
    }
}

Collections.sort(persons, new PersonComparator());

问题是,属性列表很长,所以在Android&#39;中为每个属性制作一个比较器。 java是太多的工作(它是可行的,但我懒惰),所以我想要一个带反射的比较器。在java中,这被称为 bean比较器,但我不知道如何在Android&#39; Android中实现这样的功能。的java。

2 个答案:

答案 0 :(得分:1)

BeanComparator Util是Apache Commons BeanUtil的一部分。

这篇文章https://stackoverflow.com/a/23408171/847592提到了如何通过导入android-java-air-bridge.jar

来访问这些库

答案 1 :(得分:0)

因为该帖子中的那个人说这个解决方案并不是很好的&#34;我创建了自己的bean比较器类,其中包括排序方向。以下是我的解决方案:

package denavo.ape;

import java.lang.reflect.Method;
import java.util.Comparator;

/**
 * Created by Dennis Van de Vorst on 3-3-2016.
 */

public class _ApeItemComparator implements Comparator<_ApeItem> {




//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// Variables //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

Method method;
Boolean invertDirection;




//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// functions //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////
// constructor

_ApeItemComparator(String methodName, Boolean invertDirection) {

    // 1. set invertDirection
    this.invertDirection = invertDirection;

    // 2. set method
    try {
        this.method = _ApeItem.class.getMethod( methodName, null);
    } catch(Exception e){
        e.printStackTrace();
        this.method = null;
    }

}



//////////////////////////////////////////////////////////////////////////////////////////////
// functions : compare

@Override
public int compare(_ApeItem apeItem1, _ApeItem apeItem2) {

    // 1. declare variables
    String property1 = null, property2 = null;

    // 2. get the property strings
    try{
        property1 = (String) method.invoke(apeItem1, null);
        property2 = (String) method.invoke(apeItem2, null);
    } catch(Exception e){
        e.printStackTrace();
    }

    // 3. if the direction is inverted, swap the two strings
    if (invertDirection){
        String temp = property1;
        property1 = property2;
        property2 = temp;
    }

    // 4. check if the strings are doubles
    if(property1.matches("([0-9]*)\\.([0-9]*)") && property2.matches("([0-9]*)\\.([0-9]*)") )
         return  compareStringsAsDoubles(property1, property2);

    // 5. check if they are integers
    else if(property1.matches("[0-9]+") && property2.matches("[0-9]+") )
        return Integer.parseInt(property1)-Integer.parseInt(property2);

    // 6. if they are strings then compare them as strings
    else
         return property1.compareTo(property2);
}



//////////////////////////////////////////////////////////////////////////////////////////////
// functions : compare strings as doubles

private int compareStringsAsDoubles(String double1, String double2){
    if (Double.parseDouble(double1) < Double.parseDouble(double2) )
        return -1;
    else if (Double.parseDouble(double1) == Double.parseDouble(double2))
        return 0;
    else
        return 1;
}

}