对象集合、对象数组、数组排序工具类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.CollationKey;
import java.text.Collator;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.ReflectionUtils;

/**
 * 集合工具类
 * 
 * @author Duncan
 * 
 * @d2013-11-20
 */
public class CollectionUtil {

	public final static String SORT_DESC = "desc";
	public final static String SORT_ASC = "asc";

	/**
	 * 判断集合不为空
	 * 
	 * @param c
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static boolean isEmpty(Collection c) {
		return c == null || c.size() == 0;
	}

	/**
	 * List集合排序类
	 * 
	 * @param <T>
	 * @param list
	 *            集合
	 * @param property
	 *            排序字段名
	 * @param sortType
	 *            正序 (CollectionUtil.SORT_ASC)、倒序 (CollectionUtil.SORT_DESC)
	 * @param isCN
	 *            是否按中文排序
	 */
	public static <T> void sortList(List<T> list, final String property, final String sortType, final boolean isCN) {
		Collections.sort(list, new Comparator<T>() {
			private Collator collator = null;

			public int compare(T a, T b) {
				int ret = 0;
				Field field = ReflectionUtils.findField(a.getClass(), property);
				String getterMethodName = "get" + StringUtils.capitalize(property);
				Method method = ReflectionUtils.findMethod(a.getClass(), getterMethodName);
				Object value_a = ReflectionUtils.invokeMethod(method, a);
				Object value_b = ReflectionUtils.invokeMethod(method, b);
				if (field.getType() == String.class) {
					if (isCN) {
						collator = Collator.getInstance();
						CollationKey key1 = collator.getCollationKey(value_a.toString());
						CollationKey key2 = collator.getCollationKey(value_b.toString());
						if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
							ret = key2.compareTo(key1);
						else
							ret = key1.compareTo(key2);
					} else {
						if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
							ret = value_b.toString().compareTo(value_a.toString());
						else
							ret = value_a.toString().compareTo(value_b.toString());
					}
				} else if (field.getType() == Integer.class || field.getType() == Long.class || field.getType() == BigDecimal.class) {
					BigDecimal decA = new BigDecimal(value_a.toString());
					BigDecimal decB = new BigDecimal(value_b.toString());
					if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
						ret = decB.compareTo(decA);
					else
						ret = decA.compareTo(decB);
				} else if (field.getType() == Date.class) {
					if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
						ret = ((Date) value_b).compareTo((Date) value_a);
					else
						ret = ((Date) value_a).compareTo((Date) value_b);
				}
				return ret;
			}
		});
	}

	/**
	 * 对象数组排序
	 * 
	 * @param <T>
	 * @param array
	 *            对象数组
	 * @param property
	 *            排序字段名
	 * @param sortType
	 *            正序 (CollectionUtil.SORT_ASC)、倒序 (CollectionUtil.SORT_DESC)
	 * @param isCN
	 *            是否按中文排序
	 */
	public static <T> void sortObjectArray(T[] array, final String property, final String sortType, final boolean isCN) {
		Arrays.sort(array, new Comparator<T>() {
			private Collator collator = null;
			public int compare(T a, T b) {
				int ret = 0;
				Field field = ReflectionUtils.findField(a.getClass(), property);
				String getterMethodName = "get" + StringUtils.capitalize(property);
				Method method = ReflectionUtils.findMethod(a.getClass(), getterMethodName);
				Object value_a = ReflectionUtils.invokeMethod(method, a);
				Object value_b = ReflectionUtils.invokeMethod(method, b);
				if (field.getType() == String.class) {
					if (isCN) {
						collator = Collator.getInstance();
						CollationKey key1 = collator.getCollationKey(value_a.toString());
						CollationKey key2 = collator.getCollationKey(value_b.toString());
						if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
							ret = key2.compareTo(key1);
						else
							ret = key1.compareTo(key2);
					} else {
						if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
							ret = value_b.toString().compareTo(value_a.toString());
						else
							ret = value_a.toString().compareTo(value_b.toString());
					}
				} else if (field.getType() == Integer.class || field.getType() == Long.class || field.getType() == BigDecimal.class) {
					BigDecimal decA = new BigDecimal(value_a.toString());
					BigDecimal decB = new BigDecimal(value_b.toString());
					if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
						ret = decB.compareTo(decA);
					else
						ret = decA.compareTo(decB);
				} else if (field.getType() == Date.class) {
					if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC))
						ret = ((Date) value_b).compareTo((Date) value_a);
					else
						ret = ((Date) value_a).compareTo((Date) value_b);
				}
				return ret;
			}
		});
	}

	/**
	 * 数组排序
	 * @param <T>
	 * @param array
	 * 		要排序的数组
	 * @param isCN
	 * 		是否按中文排序
	 * @param sortType
	 * 		正序 (CollectionUtil.SORT_ASC)、倒序 (CollectionUtil.SORT_DESC)
	 */
	public static <T> void sortArray(T[] array, final boolean isCN, final String sortType) {
		if (sortType != null && sortType.equals(CollectionUtil.SORT_DESC)) {
			if (isCN) {
				Arrays.sort(array, Collections.reverseOrder(Collator.getInstance(java.util.Locale.CHINA)));
			} else {
				Arrays.sort(array, Collections.reverseOrder());
			}
		} else {
			if (isCN) {
				Arrays.sort(array, Collator.getInstance(java.util.Locale.CHINA));
			} else {
				Arrays.sort(array);
			}
		}
	}

//	public static void main(String[] args) {
//		User[] arrays = new User[3];
//		User user = new User();
//		user.setId(Long.valueOf(1111));
//		user.setStrName("张三");
//		user.setStrPwd("123456");
//		arrays[0] = user;
//		user = new User();
//		user.setId(Long.valueOf(2222));
//		user.setStrName("李四");
//		user.setStrPwd("234567");
//		arrays[1] = user;
//		user = new User();
//		user.setId(Long.valueOf(3333));
//		user.setStrName("王五");
//		user.setStrPwd("345678");
//		arrays[2] = user;
//		CollectionUtil.sortObjectArray(arrays, "strName", SORT_ASC, true);
//		for (User po : arrays) {
//			System.out.println(po.toString());
//		}
//
//		String[] newArray = { "中山", "汕头", "广州", "安庆", "阳江", "南京", "武汉", "北京", "安阳", "北方" };
//		CollectionUtil.sortArray(newArray, true, SORT_DESC);
//		for (String i : newArray) {
//			System.out.print(i + "  ");
//		}
//	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值