我的问题是这个;我必须订购一张数据表。表的每一行都是存储在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),这并不意味着我会写几百行几乎相同的代码?
谢谢大家!
答案 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)