`
hvang1988
  • 浏览: 51110 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

java实现集合对象排序(多个字段)

阅读更多
好消息,百度网盘专业搜索网站上线了
打开瞧一瞧: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 对象数组按照多个属性进行排序”的详细解析,希望对你理解Java排序机制有所帮助。在实际开发中,灵活运用这些技巧可以提高代码的可维护性和效率。

    List&lt;map&gt;多字段组合排序

    List,List, Object&gt;&gt;,多字段组合排序。提供一个简易的思路,如果需要进行参考。

    Java8 用Lambda表达式给List集合排序的实现

    本文主要介绍了Java8 中使用Lambda表达式给List集合排序的实现,通过示例代码详细地介绍了整个排序过程,涵盖了顺序排序、逆序排序和多条件排序等多种情况。 Lambda表达式与函数式编程 在Java8 中,Lambda表达式是...

    java 中文姓氏 排序

    如果我们需要对一个对象列表中的某个字段(如年龄)进行排序,可以创建一个 `Comparator` 实现。 ```java import java.util.*; import java.text.*; public class JobCandidateSort { public static void main...

    Java中的Comparator 对多个排序条件的处理

    当需要根据多个排序条件对集合进行排序时,可以使用多个`Comparator`组合的方式来实现。这篇博客文章"Java中的Comparator 对多个排序条件的处理"可能详细讨论了如何实现这一目标。 首先,`Comparator`的基本用法是...

    java汉字排序

    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种方法】 在Java编程中,当我们处理包含重复元素的List时,有时需要去除其中的重复项。以下文章将详细介绍8种针对List集合对象去重的方法,包括基于对象整体以及按特定属性...

    java-集合-知识点汇总

    Java集合可以存储多个元素,每个元素可以是任何类型的对象。Java集合可以分为两大类:Collection和Map。 Java集合的类型 Java集合有多种类型,常见的有ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap...

    搜索功能设计java实现

    - **Java集合框架**:Java集合框架如List、Set和Map等,提供基本的搜索功能。例如,ArrayList的`indexOf()`方法可以搜索指定元素的索引。 - **Java 8 Stream API**:Stream API引入了强大的函数式编程能力,可以...

    java集合排序方法总结共13页.pdf.zip

    对于更复杂的排序需求,如多级排序或根据多个字段排序,我们可以使用Comparator的`thenComparing()`方法链式调用来实现。 ```java Comparator&lt;MyObject&gt; comparator = Comparator.comparing(MyObject::getAge) ....

    List对象排序通用方法

    总的来说,通过`Collections.sort()`配合自定义`Comparator`,我们可以灵活地对包含对象的`List`进行排序,无论是正序、倒序还是基于多个字段的复杂排序需求。这种方法避免了频繁的数据库查询,提高了程序效率,同时...

    java List排序demo

    现在我们可以创建一个包含多个`Student`对象的`List`,然后调用`Collections.sort()`方法进行排序: ```java List&lt;Student&gt; students = Arrays.asList( new Student("Tom", 85), new Student("Jerry", 92), new ...

    java8-像使用SQL一样排序集合.pdf

    `thenComparing()` 方法允许我们链式调用多个比较器,以实现多级排序。这个功能在处理复杂数据结构时非常有用,可以轻松地根据对象的不同属性进行排序。 总结来说,Java 8 的集合排序功能使得对数据的操作更加高效...

    Java集合框架详解

    在Java集合框架中,Map接口的实现类广泛用于存储键值对数据结构。主要实现类包括HashMap、Hashtable、LinkedHashMap和TreeMap。 1. HashMap:它利用键的hashCode值存储数据,根据键快速定位到值。由于使用了哈希表...

    在Java 8中将List转换为Map对象方法

    本文将详细介绍在Java 8中将List转换为Map对象的方法,并提供了多种实现方式。 首先,我们需要明确Map的key是什么?在这个例子中,我们使用员工对象的empId作为key,值是员工姓名。我们可以使用Java 8中的Streams ...

    Java对List对象进行排序_.docx

    在Java编程中,对List对象进行排序是一个常见的需求,尤其是在处理数据集合时。Java提供了一个便捷的方法`Collections.sort()`,可以直接对实现了`Comparable`接口的List进行排序。然而,当需要根据对象内部的某个...

    java8 stream自定义分组求和并排序的实现

    在示例代码中,我们首先创建了一个 `List` 集合,用于存储多个 `GroupDetailDTO` 对象。然后,我们使用 Java8 Stream 的 `stream` 方法将集合转换为流式数据。接着,我们使用 `collect` 方法对流式数据进行分组求和...

    java8实现list集合中按照某一个值相加求和,平均值等操作代码

    例如,如果我们想按`sendTime`字段对Message对象进行降序排序,可以使用`sorted()`方法: ```java List&lt;Message&gt; sortedMessages = messages.stream() .sorted(Comparator.comparing(Message::getSendTime)....

    java 工具类代码集合

    - `HashCodeUtils`和`EqualsUtils`:帮助实现对象的`hashCode()`和`equals()`方法。 这些工具类在实际开发中扮演着不可或缺的角色,它们提高了代码的可读性和复用性,降低了编程的复杂度。通过深入理解和熟练运用...

Global site tag (gtag.js) - Google Analytics