疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Javaava类Objects,TreeMap排序分享


 

 
开心一笑
 
【记者去采访一山区百岁老农: “老人家,你是吃什么东西才能保持长寿的啊?” 
百岁老农: “我们这只能种玉米,平时也是以玉米为主食。” 
记者: “那你现在最大的愿望是什么呢”。 
百岁老农: “我最想死。” 
记者: “啊!为什么?” 
百岁老农:“吃了一百年的玉米,你不想死啊?”】
 
唯美图片
 
提出问题
 
项目常用类Objects,TreeMap分享???
 
解决问题
 
1.Objects介绍
 
Java.Util.Objects是Java 1.7引入的类,提供了针对对象的一些常用方法,总共提供了12个方法。可以自己查看JDK帮助文档,项目中,我用到的一个常用方法就是isNull/nonNull。
 
2.isNull/nonNull具体实例
 
在工作中我经常会用Objects.isNull()来判断对象是否为空。下面是一些
 
/**
 * @Author 阿毅
 * Created by Ay on 2016/01/05.
 */
public class Ay{
 
    @Test
    public void test(){
        Boy boy = null;
        Girl girl = new Girl();
        List<Boy> boyList = new ArrayList<>();
        List<Girl> girlList = null;
        String testStr = null;
        System.out.println("boy is :" + Objects.isNull(boy));//boy is :true
        System.out.println("gire is : " + Objects.isNull(girl));//gire is : false
        System.out.println("boyList is :" + Objects.isNull(boyList));//boyList is :false
        System.out.println("girlList is :" + Objects.isNull(girlList));//girlList is :true
        System.out.println("testStr is + " + Objects.isNull(testStr));//testStr is + true
        System.out.println(">>>--------------------------------------");
        System.out.println("boy is :" + Objects.nonNull(boy));//boy is :false
        System.out.println("gire is : " + Objects.nonNull(girl));//gire is : true
        System.out.println("boyList is :" + Objects.nonNull(boyList));//boyList is :true
        System.out.println("girlList is :" + Objects.nonNull(girlList));//girlList is :false
        System.out.println("testStr is + " + Objects.nonNull(testStr));//testStr is + false
    }
 
    class Boy{}
    class Girl{}
 
}
3.俩种对象判空的个人想法
 
对象判空if(object == null)也是可以的。
 
但是:
 
个人感觉if(Objects.isNull(object)) 比 if(object == null) 更加标准和正规。
我们看看Objects对象判空的源码:
 
public static boolean isNull(Object obj) {
    return obj == null;
}
4.SortedMap和TreeMap简单介绍
 
SortedMap保证按照键的升序排列的映射,可以按照键的自然顺序(参见 Comparable 接口)进行排序,或者通过创建有序映射时提供的比较器进行排序。
 
SortedMap是一个接口,TreeMap是其具体实现。
理论一大堆,自己上百度搜。
5.SortedMap和TreeMap默认升序排序实例
 
TreeMap默认按照升序排序
例1:
 
@Test
public void test() throws Exception{
    //TreeMap默认按照升序排序
    SortedMap<Double, String> map = new TreeMap<>();
    map.put(2.33, "ccccc");
    map.put(2.0, "aaaaa");
    map.put(3.0, "bbbbb");
    map.put(4.0, "ddddd");
    Set<Double> keySet = map.keySet();
    Iterator<Double> iter2 = keySet.iterator();
    while (iter2.hasNext()) {
        Double key = iter2.next();
        System.out.println(key + ":" + map.get(key));
    }
}
 
打印结果:
 
2.0:aaaaa
2.33:ccccc
3.0:bbbbb
4.0:ddddd
例2:
 
@Test
public void test(){
    //TreeMap默认按照升序排序
    SortedMap<String, String> map = new TreeMap<>();
    map.put("b", "ccccc");
    map.put("d", "aaaaa");
    map.put("c", "bbbbb");
    map.put("a", "ddddd");
    Set<String> keySet = map.keySet();
    Iterator<String> iter = keySet.iterator();
    while (iter.hasNext()) {
        String key = iter.next();
        System.out.println(key + ":" + map.get(key));
    }
}
 
打印结果:
 
a:ddddd
b:ccccc
c:bbbbb
d:aaaaa
5.SortedMap和TreeMap降序排序实例
 
TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,如下:
 
@Test
public void test(){
    //TreeMap默认按照升序排序
    Map<String, String> map = new TreeMap<>(new Comparator<String>(){
        public int compare(String obj1, String obj2) {
            // 降序排序
            return obj2.compareTo(obj1);
            // 升序排序
            //return obj1.compareTo(obj2);
        }
     });
    map.put("b", "ccccc");
    map.put("d", "aaaaa");
    map.put("c", "bbbbb");
    map.put("a", "ddddd");
    Set<String> keySet = map.keySet();
    Iterator<String> iter = keySet.iterator();
    while (iter.hasNext()) {
        String key = iter.next();
        System.out.println(key + ":" + map.get(key));
    }
}
6.Java中Map集合对Value字段进行排序
 
这个需求是我在项目中碰到的问题,业务场景如下:
 
想要通过获取Map集合中Value值最大,所对应的Key的值。
 
网上搜索下,本来想搜索相关的开源工具类,结果没找到。不过已经有高手写了些工具类,具体如下:
 
这里我只贴出Java8的版本,代码很简洁:
 
 //传入一个map集合
 public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
    //新建一个LinkedHashMap对象
    Map<K, V> result = new LinkedHashMap<>();
    //获取Entry<K,V>流
    Stream<Entry<K, V>> st = map.entrySet().stream();
    //利用函数式进行排序
    st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e -> result.put(e.getKey(), e.getValue()));
 
    return result;
}