java 鍵值對 按值排序

在最近寫程序題的時候,須要存儲一個key爲char,value爲string的map,後來須要根據string的長度對map從小到大進行排序。java

clipboard.png

目標:安全

clipboard.png

1.用Pair配對

一開始用的是HashMap,可是後面發現HashMap是無序的,因而想把HashMap的一個鍵值對取出來,存到集合裏,再對集合進行自定義排序,上網搜到有一個配對的類Pair,他有一個key和一個value屬性,想到用來代替HashMap的一個鍵值對。ide

clipboard.png

用ArrayList代替HashMap,而後ArrayList中的元素爲配對類,變相實現了一個鍵對應一個值的集合,而且可以排序。spa

首先存儲配對到集合中:

ArrayList<Pair<Integer, String>> pairs = new ArrayList<>();
        Pair<Integer, String> pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);

對集合進行排序

調用ArrayList對象的sort方法進行排序,他須要Comparator接口,有三種實現方法:code

內部類進行排序

public class Main {

    public static void main(String[] args) {
        ArrayList<Pair<Integer, String>> pairs = new ArrayList<>();
        Pair<Integer, String> pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
        pairs.sort(new Main().new StringCmp());//創建Main內部類的一個實例對象
    }
    //實現比較接口的內部類
    public class StringCmp implements Comparator{
        @Override
        public int compare(Object o1, Object o2) {
            Pair<Integer, String> s1 = (Pair)o1;
            Pair<Integer, String> s2 = (Pair)o2;
            return new Integer(s1.getValue().length()).compareTo(s2.getValue().length());
        }
    }
}

匿名內部類進行排序

若是不須要複用這個排序的方法,單獨爲他寫一個類太過浪費又不安全,可使用匿名的內部類對象

public class Main {

    public static void main(String[] args) {
        ArrayList<Pair<Integer, String>> pairs = new ArrayList<>();
        Pair<Integer, String> pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
        //使用匿名內部類
        pairs.sort(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Pair<Integer, String> s1 = (Pair)o1;
                Pair<Integer, String> s2 = (Pair)o2;
                return new Integer(s1.getValue().length()).compareTo(s2.getValue().length());
            }
        });

    }
}

判斷的代碼雷同,只是不用在去新建一個類。blog

lambda表達式

lambda表達式就是匿名內部類的簡寫版:排序

import javafx.util.Pair;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        ArrayList<Pair<Integer, String>> pairs = new ArrayList<>();
        Pair<Integer, String> pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
        pairs.sort((pair1, pair2)->{return new Integer(pair1.getValue().length()).compareTo(new Integer(pair2.getValue().length()));});
    }
}

2.用TreeMap進行排序

用配對進行存儲初步解決了目的,可是這樣存儲的就不是Map而是ArrayList的了,也就不能使用Map的方法,雖然解決了需求,可是感受方向錯了,去網上一搜,返現Map有可以排序的實現類TreeMap,他僅需建立時傳入Comparator的接口實現類,就可以實現存儲是排序了:接口

public class Main {

    public static void main(String[] args) {
        TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>((s1, s2)->{
            return new Integer(s1.length()).compareTo(new Integer(s2.length()));
        });
        treeMap.put("abc", 1);
        treeMap.put("abcd", 2);
        treeMap.put("ab", 3);
        treeMap.put("abcde", 4);
    }
}

代碼簡短,通俗易懂,可是由於TreeMap只能按照key進行排序,而個人要求是根據value的長度進行排序,全部在這裏我把key和value的類型互換了,但這樣以前能夠經過int類型的編號找到string類型值,在更改以後,就不能經過標號找到值了.雖然有好處良多,可是不符合個人狀況.ip

3.HashMap轉成list再排序

HashMap的對象有一個方法,他能夠把全部的鍵值對集合轉換爲一個set集合,集合元素是Map.Entry,能夠把HashMap轉換爲Set以後再轉換成ArrayList再調用sort方法進行排序,達到根據value進行排序的效果:

public class Main {

    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "aec");
        hashMap.put(2, "abcd");
        hashMap.put(3, "ab");
        hashMap.put(4, "abcde");
        ArrayList<Map.Entry<Integer, String>> arrayList = new ArrayList<>(hashMap.entrySet());
        arrayList.sort((entry1, entry2)->{
            return new Integer(entry1.getValue().length()).compareTo(new Integer(entry2.getValue().length()));
        });
    }
}

感受這是第一種方法,加上一個HashMap獲得的結果,這樣能夠從按照value進行排序(排序結果保存在arrayList中),也能夠從key找到value(在HashMap中),可是存儲內存卻浪費了,多了一個list,不知道有沒有直接根據value直接排序的map.

相關文章
相關標籤/搜索