Java-Comparator比较器-中文排序
一、前言
- JDK:1.8
- 参考:
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
https://www.yiibai.com/java/java_using_comparator.html
https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html
二、正文
通过实现
Comparator
接口,实现数字排序和中文排序
[ java.util.List ].stream().sorted( … ) … ;
Collections.sort( … );
- 示例
package com.test.java;
import java.text.Collator;
import java.util.*;
import java.util.stream.Collectors;
public class SortDemo {
public static void main(String[] args) {
// 初始化数据
List<Map<String, Object>> datas = initData();
// 排序前
System.out.println("=== 排序前");
datas.forEach(System.out::println);
// collections
// collectionsSort(datas, "name");
// collectionsSortForLamda(datas, "name");
// stream
datas = streamSortByChinese(datas, "name");
// datas = streamSortByNum(datas, "age");
// 排序后
System.out.println("=== 排序后");
datas.forEach(System.out::println);
}
/**
* stream 中文排序
* @param datas 列表数据
* @param mKey List 中 Map 的 key
* @return
* */
public static List<Map<String, Object>> streamSortByChinese(List<Map<String, Object>> datas, String mKey){
return datas.stream().sorted((m1, m2) -> {
String name1 = m1.get(mKey).toString();
String name2 = m2.get(mKey).toString();
Collator collator = Collator.getInstance(Locale.CHINA);
return collator.compare(name1, name2);
}).collect(Collectors.toList());
}
/**
* stream 数字排序
* @param datas 列表数据
* @param mKey List 中 Map 的 key
* @return
* */
public static List<Map<String, Object>> streamSortByNum(List<Map<String, Object>> datas, String mKey){
return datas.stream().sorted((o1, o2) ->
o1.get(mKey).toString().compareTo(o2.get(mKey).toString())
).collect(Collectors.toList());
}
/**
* Collections 中文排序
* @param datas 列表数据
* @param mKey List 中 Map 的 key
* @return
* */
public static void collectionsSort(List<Map<String, Object>> datas, String mKey){
Collections.sort(datas, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
String name1 = o1.get(mKey).toString();
String name2 = o2.get(mKey).toString();
Collator collator = Collator.getInstance(Locale.CHINA);
return collator.compare(name1, name2);
}
});
}
/**
* Collections 中文排序- Lamda 实现
* @param datas 列表数据
* @param mKey List 中 Map 的 key
* @return
* */
public static void collectionsSortForLamda(List<Map<String, Object>> datas, String mKey){
Collections.sort(datas, (o1, o2) -> {
String name1 = o1.get(mKey).toString();
String name2 = o2.get(mKey).toString();
Collator collator = Collator.getInstance(Locale.CHINA);
return collator.compare(name1, name2);
});
}
/**
* 初始化数据
* @return
* */
public static List<Map<String, Object>> initData(){
// 需要排序的列表
List<Map<String, Object>> datas = new ArrayList<>();
// 示例数据
Map<String, Object> map1 = new HashMap<>();
map1.put("name", "李一");
map1.put("age", 18);
datas.add(map1);
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "左二");
map2.put("age", 20);
datas.add(map2);
Map<String, Object> map3 = new HashMap<>();
map3.put("name", "张三");
map3.put("age", 26);
datas.add(map3);
Map<String, Object> map4 = new HashMap<>();
map4.put("name", "戴四");
map4.put("age", 22);
datas.add(map4);
return datas;
}
}