我试图通过该对象的属性对对象列表进行排序。例如,名为" 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。
答案 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;
}
}