List根据对象中的指定元素进行排序

1、先写排序的功能方法  ListUtilsMain.java 

import java.lang.reflect.Field;
import java.text.NumberFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
 
/**
 * @author xzx
 * 在数据库中查出来的列表中,往往需要对不同的字段重新排序。 一般的做法都是使用排序的字段,重新到数据库中查询。
 * 如果不到数据库查询,直接在第一次查出来的list中排序,无疑会提高系统的性能。 下面就写一个通用的方法,对list排序,
 * 
 * 至少需要满足以下5点:
 * 
 * ①.list元素对象类型任意 
 * 		---->使用泛型解决
 * 
 * ②.可以按照list元素对象的任意多个属性进行排序,即可以同时指定多个属性进行排序 
 * 		--->使用java的可变参数解决
 * 
 * ③.list元素对象属性的类型可以是数字(byte、short、int、long、float、double等,包括正数、负数、0)、字符串(char、String)、日期(java.util.Date)
 * 		--->对于数字:统一转换为固定长度的字符串解决,比如数字3和123,转换为"003"和"123" ;再比如"-15"和"7"转换为"-015"和"007" 
 * 		--->对于日期:可以先把日期转化为long类型的数字,数字的解决方法如上
 * 
 * ④.list元素对象的属性可以没有相应的getter和setter方法 
 * 		--->可以使用java反射进行获取private和protected修饰的属性值
 * 
 * ⑤.list元素对象的对象的每个属性都可以指定是升序还是降序
 * 	  	-->使用2个重写的方法(一个方法满足所有属性都按照升序(降序),另外一个方法满足每个属性都能指定是升序(降序))
 * 
 *
 */
public class ListUtilsMain {
	 
	
		/**
		 * 对list的元素按照多个属性名称排序,
		 * list元素的属性可以是数字(byte、short、int、long、float、double等,支持正数、负数、0)、char、String、java.util.Date
		 * 
		 * 
		 * @param lsit
		 * @param sortname
		 *            list元素的属性名称
		 * @param isAsc
		 *            true升序,false降序
		 */
		public static <E> void sort(List<E> list, final boolean isAsc, final String... sortnameArr) {
			Collections.sort(list, new Comparator<E>() {
	 
				public int compare(E a, E b) {
					int ret = 0;
					try {
						for (int i = 0; i < sortnameArr.length; i++) {
							ret = ListUtilsMain.compareObject(sortnameArr[i], isAsc, a, b);
							if (0 != ret) {
								break;
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
					return ret;
				}
			});
		}
		
		/**
		 * 给list的每个属性都指定是升序还是降序
		 * 
		 * @param list
		 * @param sortnameArr  参数数组
		 * @param typeArr      每个属性对应的升降序数组, true升序,false降序
		 */
	 
		public static <E> void sort(List<E> list, final String[] sortnameArr, final boolean[] typeArr) {
			if (sortnameArr.length != typeArr.length) {
				throw new RuntimeException("属性数组元素个数和升降序数组元素个数不相等");
			}
			Collections.sort(list, new Comparator<E>() {
				public int compare(E a, E b) {
					int ret = 0;
					try {
						for (int i = 0; i < sortnameArr.length; i++) {
							ret = ListUtilsMain.compareObject(sortnameArr[i], typeArr[i], a, b);
							if (0 != ret) {
								break;
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
					return ret;
				}
			});
		}
	 
		/**
		 * 对2个对象按照指定属性名称进行排序
		 * 
		 * @param sortname
		 *            属性名称
		 * @param isAsc
		 *            true升序,false降序
		 * @param a
		 * @param b
		 * @return
		 * @throws Exception
		 */
		private static <E> int compareObject(final String sortname, final boolean isAsc, E a, E b) throws Exception {
			int ret;
			Object value1 = ListUtilsMain.forceGetFieldValue(a, sortname);
			Object value2 = ListUtilsMain.forceGetFieldValue(b, sortname);
			String str1 = value1.toString();
			String str2 = value2.toString();
			if (value1 instanceof Number && value2 instanceof Number) {
				int maxlen = Math.max(str1.length(), str2.length());
				str1 = ListUtilsMain.addZero2Str((Number) value1, maxlen);
				str2 = ListUtilsMain.addZero2Str((Number) value2, maxlen);
			} else if (value1 instanceof Date && value2 instanceof Date) {
				long time1 = ((Date) value1).getTime();
				long time2 = ((Date) value2).getTime();
				int maxlen = Long.toString(Math.max(time1, time2)).length();
				str1 = ListUtilsMain.addZero2Str(time1, maxlen);
				str2 = ListUtilsMain.addZero2Str(time2, maxlen);
			}
			if (isAsc) {
				ret = str1.compareTo(str2);
			} else {
				ret = str2.compareTo(str1);
			}
			return ret;
		}
	 
		/**
		 * 给数字对象按照指定长度在左侧补0.
		 * 
		 * 使用案例: addZero2Str(11,4) 返回 "0011", addZero2Str(-18,6)返回 "-000018"
		 * 
		 * @param numObj
		 *            数字对象
		 * @param length
		 *            指定的长度
		 * @return
		 */
		public static String addZero2Str(Number numObj, int length) {
			NumberFormat nf = NumberFormat.getInstance();
			// 设置是否使用分组
			nf.setGroupingUsed(false);
			// 设置最大整数位数
			nf.setMaximumIntegerDigits(length);
			// 设置最小整数位数
			nf.setMinimumIntegerDigits(length);
			return nf.format(numObj);
		}
	 
		/**
		 * 获取指定对象的指定属性值(去除private,protected的限制)
		 * 
		 * @param obj
		 *            属性名称所在的对象
		 * @param fieldName
		 *            属性名称
		 * @return
		 * @throws Exception
		 */
		public static Object forceGetFieldValue(Object obj, String fieldName) throws Exception {
			Field field = obj.getClass().getDeclaredField(fieldName);
			Object object = null;
			boolean accessible = field.isAccessible();
			if (!accessible) {
				// 如果是private,protected修饰的属性,需要修改为可以访问的
				field.setAccessible(true);
				object = field.get(obj);
				// 还原private,protected属性的访问性质
				field.setAccessible(accessible);
				return object;
			}
			object = field.get(obj);
			return object;
		}
	}


2、创建实体类  UserInfo.java

package com.smartxp.api.test;

import java.text.SimpleDateFormat;
import java.util.Date;

public class UserInfo {

	private static final long serialVersionUID = -3522051445403971732L;
	 
	private Integer userId;
	private String username;
	private Date birthDate;
	private Integer age;
	private float fRate;
	private char ch;
 
	public Date getBirthDate() {
		return birthDate;
	}
 
	public String getBirthDatestr() {
		SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
		return formater.format(getBirthDate());
	}
 
	public UserInfo(Integer userId, String username, Date birthDate, Integer age, float fRate, char ch) {
		super();
		this.userId = userId;
		this.username = username;
		this.birthDate = birthDate;
		this.age = age;
		this.fRate = fRate;
		this.ch = ch;
	}
 
	@Override
	public String toString() {
		return "UserInfo [userId=" + userId + ", \tusername=" + username + ", \tbirthDate=" + getBirthDatestr()
				+ ", \tage=" + age + ", fRate=" + fRate + ", ch=" + ch + "]";
	}
 


}

3、新建测试类

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class Test {
	public static void main(String[] args) throws Exception {
		 
		Test testObj = new Test();
 
		List<UserInfo> list = new ArrayList<UserInfo>();
		// public UserInfo(Integer userId, String username, Date birthDate,Integer age, float fRate, char ch)
		SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
		UserInfo user1 = new UserInfo(3, "bbb", formater.parse("1980-12-01"), 1, 1.2f, 'a');
		UserInfo user2 = new UserInfo(0, "126", formater.parse("1900-10-11"), 03, -3.6f, 'c');
		UserInfo user3 = new UserInfo(12, "5", formater.parse("1973-08-21"), 15, 9.32f, 'f');
		UserInfo user4 = new UserInfo(465, "1567", formater.parse("2012-01-26"), 20, 12.56f, '0');
		UserInfo user5 = new UserInfo(2006, "&4m", formater.parse("2010-05-08"), 100, 165.32f, '5');
		UserInfo user6 = new UserInfo(5487, "hf67", formater.parse("2016-12-30"), 103, 56.32f, 'm');
		UserInfo user7 = new UserInfo(5487,"jigg", formater.parse("2000-10-16"), 103, 56.32f, 'm');
		UserInfo user8 = new UserInfo(5487, "jigg", formater.parse("1987-07-25"), 103, 56.32f, 'm');
 
		list.add(user1);
		list.add(user2);
		list.add(user3);
		list.add(user4);
		list.add(user5);
		list.add(user6);
		list.add(user7);
		list.add(user8);
 
		System.out.println("\n-------原来序列-------------------");
		testObj.printfUserInfoList(list);
 
		// 按userId升序、username降序、birthDate升序排序
		String [] sortNameArr = {"userId","username","birthDate"};
		boolean [] isAscArr = {true,false,true};
		ListUtilsMain.sort(list,sortNameArr,isAscArr);
		System.out.println("\n--------按按userId升序、username降序、birthDate升序排序(如果userId相同,则按照username降序,如果username相同,则按照birthDate升序)------------------");
		testObj.printfUserInfoList(list);
		
		// 按userId、username、birthDate都升序排序
		ListUtilsMain.sort(list, true, "userId", "username","birthDate");
		System.out.println("\n--------按userId、username、birthDate排序(如果userId相同,则按照username升序,如果username相同,则按照birthDate升序)------------------");
		testObj.printfUserInfoList(list);
 
		// 按userId、username都倒序排序
		ListUtilsMain.sort(list, false, "userId", "username");
		System.out.println("\n--------按userId和username倒序(如果userId相同,则按照username倒序)------------------");
		testObj.printfUserInfoList(list);
 
		// 按username、birthDate都升序排序
		ListUtilsMain.sort(list, true, "username", "birthDate");
		System.out.println("\n---------按username、birthDate升序(如果username相同,则按照birthDate升序)-----------------");
		testObj.printfUserInfoList(list);
 
		// 按birthDate倒序排序
		ListUtilsMain.sort(list, false, "birthDate");
		System.out.println("\n---------按birthDate倒序-----------------");
		testObj.printfUserInfoList(list);
 
		// 按fRate升序排序
		ListUtilsMain.sort(list, true, "fRate");
		System.out.println("\n---------按fRate升序-----------------");
		testObj.printfUserInfoList(list);
 
		// 按ch倒序排序
		ListUtilsMain.sort(list, false, "ch");
		System.out.println("\n---------按ch倒序-----------------");
		testObj.printfUserInfoList(list);
 
	}
 
	private void printfUserInfoList(List<UserInfo> list) {
		for (UserInfo user : list) {
			System.out.println(user.toString());
		}
	}

}

运行结果如下所示


-------原来序列-------------------
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]

--------按按userId升序、username降序、birthDate升序排序(如果userId相同,则按照username降序,如果username相同,则按照birthDate升序)------------------
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]

--------按userId、username、birthDate排序(如果userId相同,则按照username升序,如果username相同,则按照birthDate升序)------------------
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]

--------按userId和username倒序(如果userId相同,则按照username倒序)------------------
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]

---------按username、birthDate升序(如果username相同,则按照birthDate升序)-----------------
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]

---------按birthDate倒序-----------------
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]

---------按fRate升序-----------------
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]

---------按ch倒序-----------------
UserInfo [userId=5487, 	username=hf67, 	birthDate=2016-12-30, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=2000-10-16, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=5487, 	username=jigg, 	birthDate=1987-07-25, 	age=103, fRate=56.32, ch=m]
UserInfo [userId=12, 	username=5, 	birthDate=1973-08-21, 	age=15, fRate=9.32, ch=f]
UserInfo [userId=0, 	username=126, 	birthDate=1900-10-11, 	age=3, fRate=-3.6, ch=c]
UserInfo [userId=3, 	username=bbb, 	birthDate=1980-12-01, 	age=1, fRate=1.2, ch=a]
UserInfo [userId=2006, 	username=&4m, 	birthDate=2010-05-08, 	age=100, fRate=165.32, ch=5]
UserInfo [userId=465, 	username=1567, 	birthDate=2012-01-26, 	age=20, fRate=12.56, ch=0]

转载自http://blog.csdn.net/enable1234___/article/details/53224740

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想对一个 List 集合对象进行排序,可以使用 Collections.sort() 方法。该方法可以根据指定的 Comparator 对象来对集合元素进行排序。Comparator 接口的 compare() 方法可以根据自定义规则来比较两个对象的大小。 以下是一个示例代码,演示如何按照固定的顺序对一个 List 集合对象进行排序: ```java import java.util.*; class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " - " + age; } } class PersonComparator implements Comparator<Person> { private final List<String> nameOrder; public PersonComparator(List<String> nameOrder) { this.nameOrder = nameOrder; } public int compare(Person p1, Person p2) { int index1 = nameOrder.indexOf(p1.name); int index2 = nameOrder.indexOf(p2.name); return Integer.compare(index1, index2); } } public class Main { public static void main(String[] args) { List<Person> persons = new ArrayList<>(); persons.add(new Person("Tom", 25)); persons.add(new Person("Alice", 30)); persons.add(new Person("Bob", 20)); persons.add(new Person("David", 27)); List<String> nameOrder = Arrays.asList("Alice", "Bob", "Tom", "David"); Comparator<Person> comparator = new PersonComparator(nameOrder); Collections.sort(persons, comparator); for (Person person : persons) { System.out.println(person); } } } ``` 在上面的示例代码,我们定义了一个 Person 类来表示人,其包含姓名和年龄两个属性。我们还定义了一个 PersonComparator 类来实现 Comparator 接口,该类可以根据固定的顺序来比较两个 Person 对象的大小。在 Main 类的 main() 方法,我们创建了一个 List 集合来存储 Person 对象,并使用 Arrays.asList() 方法创建了一个 List 来表示姓名的顺序。然后,我们创建了一个 PersonComparator 对象,并使用 Collections.sort() 方法对 List 集合进行排序。最后,我们遍历排好序的 List 集合,打印出每个 Person 对象的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值