【知识点】Java OR MYSQL中文排序
-
项目需求:需要姓名相同的都拍到一起,如下表所示
-
name 猫 猫1 猫2 蛤123 蛤蛤 -
就需要这样排序
-
想到两种解决办法,第一种使用
MySQL
的order by
排序,第二种就是使用Java
的Comparable
给List中的集合排序。 -
MySQL
排序-
select name from name_test order by convert(name USING gbk) COLLATE gbk_chinese_ci desc
-
原理是先把name字段先进行
GBK
编码,然后 使用gbk_chinese_ci
对name字段进行排序。 -
排序前
-
-
排序后
-
-
-
使用Java的
Comparable
进行排序-
/** * 组合排序 * @param list 要排序的集合 * @param key 要排序的字段 * @param desc 排序方式 */ public static <E> void sort(List<E> list, String key, String desc) { Comparator<?> comparator = null; try { comparator = new Comparator<E>() { @Override public int compare(E obj1, E obj2) { // 定义中文语境 Collator instance = Collator.getInstance(Locale.CHINA); return instance.compare(obj1, obj2); } }; comparator = ComparatorUtils.nullLowComparator(comparator); if ("desc".equals(desc)) { comparator = ComparatorUtils.reversedComparator(comparator); } Collections.sort(list, new BeanComparator(key, comparator)); } catch (Exception e) { log.error("exception = {}", e.getMessage()); e.printStackTrace(); } }
-
这里使用到了 apache-common的 beanutils、collections ,需要先将依赖引入进来
-
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency>
-
-
中文排序是按照Unicode字符码来进行比较排序的,效果不好,所以需要指定中文排序方式,使用
Locale.CHINA
。
-
-
这是使用一种key进行排序,有的业务中还需要多个key进行排序,我们使用以下方法:
-
public static <E> void sortMulti(List<?> list, String desc, String... keys) { try { Comparator<?> comparator = new Comparator<E>() { @Override public int compare(E obj1, E obj2) { // 定义中文语境 Collator instance = Collator.getInstance(Locale.CHINA); return instance.compare(obj1, obj2); } }; comparator = ComparatorUtils.nullLowComparator(comparator); if ("desc".equals(desc)) { comparator = ComparatorUtils.reversedComparator(comparator); } // 创建一个排序链 ComparatorChain<Object> multiSort = new ComparatorChain<>(); for (String key : keys) { multiSort.addComparator(new BeanComparator(key, comparator)); // 批量添加排序规则 } // 开始排序,按照先添加先排序的规则 Collections.sort(list, multiSort); } catch (Exception e) { Logger.exception(e); } }
-
代码之路任重道远
2022年7月30日10点15分