今天有个同事问我 怎么对一个List<Object> 对象进行动态多条件排序。
由于他比较急用 所以先只对它的具体某个Object 对象进行排序 他的这个Object 就是从其它几个相关实体 获取所需要的属性组成的一个pOJObean
用了差不多一个小时 整理一个思路 并写了下来; (当然存在一些问题)
我先说说我的思路: 就是利用java的反射机制 来获取属性后 再比较
(如果朋友们有其它方法请留言分享,有帮改进 也请留言,谢谢先:)
————————————————————————————————————————
/**
* 利用反射机制多条件排序
* 主要是针对字串排序
* 注 字串首字母大写
*@param list
* @param pros TestA的属性
* @return
*/
private void getSortedList(List<TestA> list,String[] pros)
{
if(pros.length<=0)
return ;
for(int i=pros.length-1;i>=0;i--){
final String pro=pros[i];
try {
Collections.sort(list, new Comparator<TestA>() {
String name = "get" + pro;
Method method = TestA.class.getMethod(name,
new Class[] {});
public int compare(TestA a, TestA b) {
if (a == null || b == null) {
return 0;
} else {
int flag=0;
try {
Object as = method.invoke(a, new Object[] {});
Object bs = method.invoke(b, new Object[] {});
if(as==null&&bs==null)
return 0;
else if(as==null)
return -1;
else if(bs==null)
return 1;
else{
if(as instanceof String ){
String va=(String)as;
String vb=(String)bs;
flag= va.compareTo(vb);
}
if(as instanceof Date){
Date va=(Date)as;
Date vb=(Date)bs;
if(va.before(vb))
return -1;
else
return 1;
}
}
} catch (IllegalArgumentException e) {
System.out.println("e1");
} catch (IllegalAccessException e) {
System.out.println("e2");
} catch (InvocationTargetException e) {
System.out.println("e3");
}
return flag;
}
}
});
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
——————————————————————————————————————
呵呵 ,做起测试了一二次 OK,就让他交差了,应该还存在一些问题哈
目前问题:1. 如果 某一个比较属性对应的值为NULL, 这里的比较应该还要改善;
2. 现在只做了对字串和时间比较,
3. 还没有扩展,只针对 TestA 这个bean List 应该可以改为Object 或泛类
4.传的参 必须为 存在的属性 且每个参首字大写 没有做异常处理 呵呵
------先记录在这儿 。。。。
分享到:
相关推荐
在Java 8中,将List转换为Map对象是一种非常实用的技术,特别是在处理大规模数据时非常有用。本文将详细介绍在Java 8中将List转换为Map对象的方法,并提供了多种实现方式。 首先,我们需要明确Map的key是什么?在这...
在上述代码中,`p => p.Age` 就是一个Lambda表达式,它告诉`OrderBy`按Person对象的Age属性进行排序。 然而,当我们需要根据多个字段进行排序时,可以连续调用`ThenBy`方法。例如,先按年龄排序,再按姓名排序: `...
为了解决`BindingList<T>`不支持自动排序的问题,我们可以创建一个自定义的`SortableBindingList<T>`类,继承自`BindingList<T>`,并在其中重写相关的成员方法以支持排序功能。 ```csharp public class ...
- Equals(Object):比较当前 List<T> 是否与指定对象相等。 - Find(Predicate<T>):查找符合指定条件的第一个元素。 - FindAll(Predicate<T>):查找符合指定条件的所有元素。 - FindIndex(Predicate<T>):返回...
72<br><br>0102 将字符串首字母转换大写 72<br><br>0103 如何进行字节数组和字符串的相互转换 72<br><br>0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73<br><br>4.2 获取字符串信息 73<br>...
### List对象属性排序知识点 #### 一、概述 在Java编程中,经常需要对`List`集合中的对象按照特定属性进行排序。传统的方法是在每个实体类中重写`Comparable`接口或提供比较器(`Comparator`),这不仅增加了代码...
在Java编程中,对List集合中的对象进行多属性排序是一项常见的任务。这通常涉及到自定义比较逻辑,以满足复杂的数据排序需求。在这个“java版本List中对象多属性排序.rar”压缩包中,我们可能找到了一个关于如何在...
本资源提供了List<Object>对对象中的属性和TreeMap<Integer, String>对键值排序,并针对100w条数据排序,对比List<Object>和TreeMap<Integer, String>排序的效率。个人认为排序效率对比可以相信,但也可能存在不科学...
`adults`现在是一个只包含年龄大于18岁的学生的IQueryable<Student>,你可以进一步对它进行操作,比如筛选、排序或分组。 在提供的文件列表中,`ModelToJson.sln`是解决方案文件,它包含了项目的所有相关信息。`...
对结果排序<br>12.4. 关联(Associations)<br>12.5. 动态关联对象获取(Dynamic association fetching)<br>12.6. 根据示例查询(Example queries)<br>13. 原生SQL查询<br>13.1. 创建一个基于SQL的Query<br>13.2....
对结果排序<br>12.4. 关联(Associations)<br>12.5. 动态关联对象获取(Dynamic association fetching)<br>12.6. 根据示例查询(Example queries)<br>13. 原生SQL查询<br>13.1. 创建一个基于SQL的Query<br>13.2....
对于包含自定义对象的List,可以实现一个比较器(Comparator)来根据对象的特定属性进行去重。 ```java @Test void testRemoveByAttribute1() { List<Player> uniquePlayers = playerList.stream() .distinct...
它类似于关系数据库,包含多个`DataTable`对象,每个`DataTable`代表一个数据表。 - **List**:是一种动态数组,可以存储任意类型的对象,并提供灵活的数据访问和管理功能。`List`在.NET Framework中是`System....
本问题中提到的情况就是如何根据对象的一个属性值对List中的对象进行分组,以便每个组包含具有相同属性值的对象。这种操作在处理集合数据时非常常见,例如在报表生成、数据分析或数据显示优化等场景。 首先,这个...
第3版 机械工业出版社<br> 教学内容和要求<br>知识点 重要程度 使用频度 难度<br>Java 入门 高 中 易<br>变量和运算符 高 高 中<br>控制结构...br>IO和串行化 高 中 难<br>知识点 重要程度 使用频度 难度<br><br>第1章...
本主题将深入探讨如何对ArrayList中的对象按照多个属性进行排序。 首先,我们来看`Student.java`类,它通常会包含一个或多个属性,比如学生的姓名(name)、学号(id)或其他信息。例如: ```java public class ...
List<Object[]> matchingRows = new ArrayList<>(); for (List<Object> row : rows) { if (row.get(columns.indexOf(columnName)).equals(value)) { matchingRows.add(row.toArray(new Object[0])); } } ...
在Java编程中,对List对象进行排序是一个常见的需求,尤其是在处理数据集合时。Java提供了一个便捷的方法`Collections.sort()`,可以直接对实现了`Comparable`接口的List进行排序。然而,当需要根据对象内部的某个...
例如,如果你有一个GridView控件,需要根据数据源中对象的某个属性进行排序,你可以在数据绑定前对数据源进行排序,或者在GridView的Sorting事件中执行排序。 以下是一个ASP.NET源码示例,展示了如何在GridView控件...
然而,如果需要对多个字段(如`username`, `birthDate`, `age`)进行排序,按照上面的方式,每次都需要创建一个新的`Comparator`,这显然不是一种高效的做法。为了解决这个问题,我们可以创建一个通用的排序方法,...