Об этом спрашивали тысячу раз, но все ответы, которые я видел, не работают на переданном Объекте, они всегда жестко запрограммированы, к какому Объекту и какому полю . Я ищу способ сортировки списка / вектора на основе строкового поля. Я не против, если он использует магию отражения или вуду.
Метод, который я написал, приводит к StackOverFlowError (каламбур предназначен!).
Я называю мой метод следующим образом:
StandardComparator.sort("distance",Vector<?>)StaticItems.LocationList,Item.SingleLocation.class);
Класс StandardComparator определен так:
public class StandardComparator {
public static void sort(final String field, Vector<?> locationList, final Class typeOfObject){
Collections.sort(locationList, new Comparator<Object>() {
@Override
public int compare(Object object1, Object object2) {
try {
return this.compare(typeOfObject.getField(field),typeOfObject.getField(field));
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return 0;
}
});
}
}
Ошибка:
E/AndroidRuntime(22828): FATAL EXCEPTION: Thread-10
E/AndroidRuntime(22828): java.lang.StackOverflowError
E/AndroidRuntime(22828): at java.lang.reflect.Field.<init>(Field.java:89)
E/AndroidRuntime(22828): at java.lang.reflect.Field.<init>(Field.java:81)
E/AndroidRuntime(22828): at java.lang.reflect.ReflectionAccessImpl.clone(ReflectionAccessImpl.java:42)
E/AndroidRuntime(22828): at java.lang.Class.getField(Class.java:870)
E/AndroidRuntime(22828): at com.AtClass.Extras.StandardComparator$1.compare(StandardComparator.java:24)
Объект SingleLocation:
public class SingleLocation {
int id;
public String deviceId;
public String title;
public String message;
public double latCoords;
public double lngCoords;
public String locSeen;
public Bitmap icon;
public double distance;
public String distanceString;
public SingleLocation(String id, String deviceId, String title, String message, String latCoords, String lngCoords, String locSeen){
this.id = Integer.valueOf(id);
this.deviceId = deviceId;
this.title = title;
this.message = message;
this.latCoords = Double.valueOf(latCoords);
this.lngCoords = Double.valueOf(lngCoords);
this.locSeen = locSeen;
}
}