和技术人员讨论TreeMap通过值对象排序的方法,记录一下
现在实现通过ReadData对象中的itemNo属性实现排序
public class ReadData {
private String itemCatagory;
private String itemNo;
private String itemName;
public String getItemCatagory() {
return itemCatagory;
}
public void setItemCatagory(String itemCatagory) {
this.itemCatagory = itemCatagory;
}
public String getItemNo() {
return itemNo;
}
public void setItemNo(String itemNo) {
this.itemNo = itemNo;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
}
第一种方法,初学者常写的方法,定义Comparator比较器,中间经过集合转换实现
public class DemoTest {
public static void main(String[] args) {
TreeMap<String,ReadData> treeMap = new TreeMap<String,ReadData>();
ReadData readData1 = new ReadData();
ReadData readData2 = new ReadData();
readData1.setItemNo("002");
readData2.setItemNo("001");
treeMap.put("111",readData1);
treeMap.put("222",readData2);
Map<String, ReadData> resultMap = sortMapByValue(treeMap); //按Value进行排序
for (Map.Entry<String, ReadData> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue().getItemNo());
}
}
public static Map<String,ReadData> sortMapByValue(Map<String,ReadData> oriMap){
if (oriMap == null || oriMap.isEmpty()) {
return null;
}
Map<String, ReadData> sortedMap = new LinkedHashMap<String, ReadData>();
List<Map.Entry<String, ReadData>> entryList = new ArrayList<Map.Entry<String, ReadData>>(
oriMap.entrySet());
Collections.sort(entryList, new MapValueComparator());
Iterator<Map.Entry<String, ReadData>> iter = entryList.iterator();
Map.Entry<String, ReadData> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
return sortedMap;
}
}
class MapValueComparator implements Comparator<Map.Entry<String, ReadData>>{
@Override
public int compare(Map.Entry<String, ReadData> me1, Map.Entry<String, ReadData> me2) {
return me1.getValue().getItemNo().compareTo(me2.getValue().getItemNo());
}
}
第二种方法,通过集合的stream流结合Comparator比较器实现(java8高级特性应用半成品)
public class DemoTest {
public static void main(String[] args) {
TreeMap<String,ReadData> treeMap = new TreeMap<String,ReadData>();
ReadData readData1 = new ReadData();
ReadData readData2 = new ReadData();
readData1.setItemNo("002");
readData2.setItemNo("001");
treeMap.put("111",readData1);
treeMap.put("222",readData2);
Map<String, ReadData> sortedMap = treeMap.entrySet().stream()
.sorted(new MapValueComparator())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldVal,newVal) -> oldVal,
LinkedHashMap::new
));
sortedMap.entrySet().forEach(System.out::println);
}
class MapValueComparator implements Comparator<Map.Entry<String, ReadData>>{
@Override
public int compare(Map.Entry<String, ReadData> me1, Map.Entry<String, ReadData> me2) {
return me1.getValue().getItemNo().compareTo(me2.getValue().getItemNo());
}
}
第三种方法,和方法二类似
public class DemoTest {
public static void main(String[] args) {
TreeMap<String,ReadData> treeMap = new TreeMap<String,ReadData>();
ReadData readData1 = new ReadData();
ReadData readData2 = new ReadData();
readData1.setItemNo("002");
readData2.setItemNo("001");
treeMap.put("111",readData1);
treeMap.put("222",readData2);
Map<String, ReadData> map = new LinkedHashMap<>();
treeMap.entrySet().stream()
.sorted(new MapValueComparator())
.forEachOrdered(e -> map.put(e.getKey(),e.getValue()));
map.entrySet().forEach(System.out::println);
}
}
class MapValueComparator implements Comparator<Map.Entry<String, ReadData>>{
@Override
public int compare(Map.Entry<String, ReadData> me1, Map.Entry<String, ReadData> me2) {
return me1.getValue().getItemNo().compareTo(me2.getValue().getItemNo());
}
}
第四种方法,完全使用stream与functional方法实现,只需一行代码(java8高级特性应用成品)
public class DemoTest {
public static void main(String[] args) {
TreeMap<String,ReadData> treeMap = new TreeMap<String,ReadData>();
ReadData readData1 = new ReadData();
ReadData readData2 = new ReadData();
readData1.setItemNo("002");
readData2.setItemNo("001");
treeMap.put("111",readData1);
treeMap.put("222",readData2);
Map<String, ReadData> map = new LinkedHashMap<>();
treeMap.entrySet().stream()
.sorted(Comparator.comparing(ReadData -> ReadData.getValue().getItemNo()))
.forEachOrdered(e -> map.put(e.getKey(),e.getValue()));
map.entrySet().forEach(System.out::println);
}
}
结论,java8高级特性真香!