在最近写程序题的时候,须要存储一个key为char,value为string的map,后来须要根据string的长度对map从小到大进行排序。java
目标:安全
一开始用的是HashMap,可是后面发现HashMap是无序的,因而想把HashMap的一个键值对取出来,存到集合里,再对集合进行自定义排序,上网搜到有一个配对的类Pair,他有一个key和一个value属性,想到用来代替HashMap的一个键值对。ide
用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表达式就是匿名内部类的简写版:排序
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()));}); } }
用配对进行存储初步解决了目的,可是这样存储的就不是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
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.