TreeMap通过值对象属性排序

和技术人员讨论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高级特性真香!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值