写了一个需要排序的map,自定义了一个comparator,但是在取值时,一直为null,固有此文章
    错误代码如下:

    1. // 这里是错误的代码
    2. // 代码可以正确排序,但是却不能正确取值。
    3. Map<String, Object> allResult = new TreeMap<>((o1, o2) -> {
    4. Date dateO1 = DateUtilPlus.parse(o1, DateUtilPlus.DATE_FORMAT);
    5. Date dateO2 = DateUtilPlus.parse(o2, DateUtilPlus.DATE_FORMAT);
    6. if (null == dateO1 || null == dateO2) {
    7. return 0;
    8. }
    9. return dateO1.before(dateO2) ? -1 : 1;
    10. });
    11. allResult.put("2018-11-30", "dddd");
    12. allResult.put("2018-11-27", "dddd");
    13. allResult.put("2018-11-28", "dddd");
    14. allResult.put("2018-11-29", "dddd");
    15. System.out.println(allResult.get("2018-11-28"));
    16. // get结果,一直是null

    查看源码发现,如果自定义了comparator,get方法会根据自定义的comparator的结果查找value

    1. public V get(Object key) {
    2. Entry<K,V> p = getEntry(key);
    3. return (p==null ? null : p.value);
    4. }
    5. final Entry<K,V> getEntry(Object key) {
    6. // Offload comparator-based version for sake of performance
    7. if (comparator != null)
    8. // 如果自定义了comparator
    9. return getEntryUsingComparator(key);
    10. // 此下代码没用,省略。。。
    11. }
    12. /** 使用自定义comparator查询 */
    13. final Entry<K,V> getEntryUsingComparator(Object key) {
    14. @SuppressWarnings("unchecked")
    15. K k = (K) key;
    16. Comparator<? super K> cpr = comparator;
    17. if (cpr != null) {
    18. Entry<K,V> p = root;
    19. while (p != null) {
    20. int cmp = cpr.compare(k, p.key);
    21. if (cmp < 0)
    22. p = p.left;
    23. else if (cmp > 0)
    24. p = p.right;
    25. else
    26. // 如果比较器返回0,说明找到了key对应的value
    27. return p;
    28. }
    29. }
    30. return null;
    31. }

    修改后的正确的map代码:

    1. Map<String, Object> allResult = new TreeMap<>((o1, o2) -> {
    2. if(StringUtils.isBlank(o1) || StringUtils.isBlank(o2)){
    3. return -1;
    4. }
    5. if(o1.equals(o2)){
    6. return 0;
    7. }
    8. Date dateO1 = DateUtilPlus.parse(o1, DateUtilPlus.DATE_FORMAT);
    9. Date dateO2 = DateUtilPlus.parse(o2, DateUtilPlus.DATE_FORMAT);
    10. if (null == dateO1 || null == dateO2) {
    11. return -1;
    12. }
    13. return dateO1.before(dateO2) ? -1 : 1;
    14. });