好消息,百度网盘专业搜索网站上线了
打开瞧一瞧:
http://bitar.cn
实现了集合的多列升序降序排列,可以支持中文字符,null字段
package com.test;
import java.lang.reflect.Method;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MutilOrder implements Comparator<Object> {
String[] fields = null;
String[] orders=null;
boolean isValue;
Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
public MutilOrder() {
super();
}
public MutilOrder(String[] fields, String[] orders) {
super();
this.fields = fields;
this.orders = orders;
}
public String[] getFields_user() {
return fields;
}
public void setFields(String[] fields_user) {
this.fields = fields_user;
}
public String[] getOrders() {
return orders;
}
public void setOrders(String[] orders) {
this.orders = orders;
}
public int compare(Object obj1, Object obj2) {
// 没有属性,则不排序
if (fields == null || fields.length <= 0) {
return 2;// 不比较
}
for (int i = 0; i < fields.length;i++ ) {
int ret=compareField(obj1, obj2, fields[i]);
if (ret==0) {
continue;
}
if (ret!=0) {
if ("asc".equalsIgnoreCase(orders[i])) {
return ret;
}else if("desc".equalsIgnoreCase(orders[i])) {
return ret*-1;
}
}else {
continue;
}
}
return 0;
}
private int compareField(Object o1, Object o2, String fieldName) {
Object value1=getFieldValueByName(fieldName, o1);
Object value2=getFieldValueByName(fieldName, o2);
if (value1==null ||value2==null) {
if (value1!=null) {
return 1;
}if (value2!=null) {
return -1;
}else {
return 0;
}
}
if (isValue) {
double v1 = ((Number)value1).doubleValue();
double v2 = ((Number)value2).doubleValue();
if (v1-v2 > 0) {
return 1;
}else if (v1==v2) {
return 0;
}
return -1;
} else {
String v1 = value1.toString();
String v2 = value2.toString();
int i= cmp.compare(v1, v2);
if (i>0) {
return 1;
}else if (i==0) {
return 0;
}
return -1;
}
}
private Object getFieldValueByName(String fieldName, Object obj) {
try {
Class<? extends Object> objClass = obj.getClass();
String Letter = fieldName.substring(0, 1).toUpperCase();
String methodStr = "get" + Letter + fieldName.substring(1);
Method method = objClass.getMethod(methodStr, new Class[] {});
Object value = method.invoke(obj, new Object[] {});
if (value instanceof Number) {
this.setValue(true);
} else {
this.setValue(false);
}
return value;
} catch (Exception e) {
System.err.println("FieldName:" + fieldName + " is not exsited.");
return null;
}
}
public boolean isValue() {
return isValue;
}
public void setValue(boolean isValue) {
this.isValue = isValue;
}
public static void main(String[] args) {
List<JavaBean> list = new ArrayList<JavaBean>();
JavaBean bean = new JavaBean(4,"张三0.01","a");
list.add(bean);
bean = new JavaBean(3,"张三0.001","a");
list.add(bean);
bean = new JavaBean(2,"王五","b");
list.add(bean);
bean = new JavaBean(1,"钱七","b");
list.add(bean);
MutilOrder comparator = new MutilOrder();
comparator.setFields(new String[] {"address","name","id"});
comparator.setOrders(new String[] {"asc","desc","asc"});
Collections.sort(list, comparator);
for (JavaBean obj : list) {
System.out.println(obj.getId()+":"+obj.getName()+":"+obj.getAddress());
}
System.out.println("OK");
}
}
class JavaBean{
private String name;
private String address;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public JavaBean(int id,String name, String address) {
super();
this.name = name;
this.address = address;
this.id = id;
}
}
结果
4:张三0.01:a
3:张三0.001:a
2:王五:b
1:钱七:b
OK
分享到:
相关推荐
在Java编程中,对象数组排序是一项常见的任务,...以上就是关于“JAVA 对象数组按照多个属性进行排序”的详细解析,希望对你理解Java排序机制有所帮助。在实际开发中,灵活运用这些技巧可以提高代码的可维护性和效率。
List,List, Object>>,多字段组合排序。提供一个简易的思路,如果需要进行参考。
本文主要介绍了Java8 中使用Lambda表达式给List集合排序的实现,通过示例代码详细地介绍了整个排序过程,涵盖了顺序排序、逆序排序和多条件排序等多种情况。 Lambda表达式与函数式编程 在Java8 中,Lambda表达式是...
如果我们需要对一个对象列表中的某个字段(如年龄)进行排序,可以创建一个 `Comparator` 实现。 ```java import java.util.*; import java.text.*; public class JobCandidateSort { public static void main...
Java将2个List集合合并到一个List里面并排序工具类 1、Java编程资源,定义了一个名为`ListMerger`的工具类,主要包含一个名为`mergeAndSortLists`的静态方法。此方法用于将两个已经根据时间顺序排列的List合并成一...
当需要根据多个排序条件对集合进行排序时,可以使用多个`Comparator`组合的方式来实现。这篇博客文章"Java中的Comparator 对多个排序条件的处理"可能详细讨论了如何实现这一目标。 首先,`Comparator`的基本用法是...
Java代码 1.import java.util.Comparator; 2.import net.sourceforge.pinyin4j.PinyinHelper; 3./** 4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class ...
【Java中List集合对象去重及按属性去重的8种方法】 在Java编程中,当我们处理包含重复元素的List时,有时需要去除其中的重复项。以下文章将详细介绍8种针对List集合对象去重的方法,包括基于对象整体以及按特定属性...
Java集合可以存储多个元素,每个元素可以是任何类型的对象。Java集合可以分为两大类:Collection和Map。 Java集合的类型 Java集合有多种类型,常见的有ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap...
- **Java集合框架**:Java集合框架如List、Set和Map等,提供基本的搜索功能。例如,ArrayList的`indexOf()`方法可以搜索指定元素的索引。 - **Java 8 Stream API**:Stream API引入了强大的函数式编程能力,可以...
对于更复杂的排序需求,如多级排序或根据多个字段排序,我们可以使用Comparator的`thenComparing()`方法链式调用来实现。 ```java Comparator<MyObject> comparator = Comparator.comparing(MyObject::getAge) ....
总的来说,通过`Collections.sort()`配合自定义`Comparator`,我们可以灵活地对包含对象的`List`进行排序,无论是正序、倒序还是基于多个字段的复杂排序需求。这种方法避免了频繁的数据库查询,提高了程序效率,同时...
现在我们可以创建一个包含多个`Student`对象的`List`,然后调用`Collections.sort()`方法进行排序: ```java List<Student> students = Arrays.asList( new Student("Tom", 85), new Student("Jerry", 92), new ...
`thenComparing()` 方法允许我们链式调用多个比较器,以实现多级排序。这个功能在处理复杂数据结构时非常有用,可以轻松地根据对象的不同属性进行排序。 总结来说,Java 8 的集合排序功能使得对数据的操作更加高效...
在Java集合框架中,Map接口的实现类广泛用于存储键值对数据结构。主要实现类包括HashMap、Hashtable、LinkedHashMap和TreeMap。 1. HashMap:它利用键的hashCode值存储数据,根据键快速定位到值。由于使用了哈希表...
本文将详细介绍在Java 8中将List转换为Map对象的方法,并提供了多种实现方式。 首先,我们需要明确Map的key是什么?在这个例子中,我们使用员工对象的empId作为key,值是员工姓名。我们可以使用Java 8中的Streams ...
在Java编程中,对List对象进行排序是一个常见的需求,尤其是在处理数据集合时。Java提供了一个便捷的方法`Collections.sort()`,可以直接对实现了`Comparable`接口的List进行排序。然而,当需要根据对象内部的某个...
在示例代码中,我们首先创建了一个 `List` 集合,用于存储多个 `GroupDetailDTO` 对象。然后,我们使用 Java8 Stream 的 `stream` 方法将集合转换为流式数据。接着,我们使用 `collect` 方法对流式数据进行分组求和...
例如,如果我们想按`sendTime`字段对Message对象进行降序排序,可以使用`sorted()`方法: ```java List<Message> sortedMessages = messages.stream() .sorted(Comparator.comparing(Message::getSendTime)....