LinkedHashMap和TreeMap排序实现

た 入场券 2022-06-08 12:39 295阅读 0赞

TreeMap

  1. TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator
  2. Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare`(T o1,To2)`方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。如下:
  3. public class TreeMapTest {
  4. public static void main(String[] args) {
  5. Map<String, String> map = new TreeMap<String, String>(
  6. new Comparator<String>() {
  7. public int compare(String obj1, String obj2) {
  8. // 降序排序
  9. return obj2.compareTo(obj1);
  10. }
  11. });
  12. map.put("c", "ccccc");
  13. map.put("a", "aaaaa");
  14. map.put("b", "bbbbb");
  15. map.put("d", "ddddd");
  16. Set<String> keySet = map.keySet();
  17. Iterator<String> iter = keySet.iterator();
  18. while (iter.hasNext()) {
  19. String key = iter.next();
  20. System.out.println(key + ":" + map.get(key));
  21. }
  22. }
  23. }

结果:

d:ddddd
c:ccccc
b:bbbbb
a:aaaaa

上面例子是对根据TreeMap的key值来进行排序的,但是有时我们需要根据TreeMap的value来进行排序。对value排序我们就需要借助于Collections的sort(List list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。如下:

  1. public class TreeMapTest {
  2. public static void main(String[] args) {
  3. Map<String, String> map = new TreeMap<String, String>();
  4. map.put("d", "ddddd");
  5. map.put("b", "bbbbb");
  6. map.put("a", "aaaaa");
  7. map.put("c", "ccccc");
  8. //这里将map.entrySet()转换成list
  9. List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
  10. //然后通过比较器来实现排序
  11. Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
  12. //升序排序
  13. public int compare(Entry<String, String> o1,
  14. Entry<String, String> o2) {
  15. return o1.getValue().compareTo(o2.getValue());
  16. }
  17. });
  18. for(Map.Entry<String,String> mapping:list){
  19. System.out.println(mapping.getKey()+":"+mapping.getValue());
  20. }
  21. }
  22. }

运行结果

  1. a:aaaaa
  2. b:bbbbb
  3. c:ccccc
  4. d:ddddd

HashMap

  1. 我们都是HashMap的值是没有顺序的,他是按照keyHashCode来实现的。对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMapvalue排序,我们一样的也可以实现HashMap的排序。
  2. public class HashMapTest {
  3. public static void main(String[] args) {
  4. Map<String, String> map = new HashMap<String, String>();
  5. map.put("c", "ccccc");
  6. map.put("a", "aaaaa");
  7. map.put("b", "bbbbb");
  8. map.put("d", "ddddd");
  9. List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
  10. Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
  11. //升序排序
  12. public int compare(Entry<String, String> o1,
  13. Entry<String, String> o2) {
  14. return o1.getValue().compareTo(o2.getValue());
  15. }
  16. });
  17. for(Map.Entry<String,String> mapping:list){
  18. System.out.println(mapping.getKey()+":"+mapping.getValue());
  19. }
  20. }
  21. }

运行结果

  1. a:aaaaa
  2. b:bbbbb
  3. c:ccccc
  4. d:ddddd

HashMap通过LinkedHashMap排序

  1. public class TestMapSortByValue {
  2. public static void main(String[] args) {
  3. Map<String, Integer> map = new HashMap<String, Integer>();
  4. map.put("d",4);
  5. map.put("a",1);
  6. map.put("c",3);
  7. map.put("e",5);
  8. map.put("b",2);
  9. //排序前
  10. System.out.println("before sort");
  11. for(Map.Entry<String, Integer> entry:map.entrySet()){
  12. System.out.println(entry.getKey()+"->"+entry.getValue());
  13. }
  14. System.out.println();
  15. //将map转成list
  16. List<Map.Entry<String, Integer>> infos = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
  17. //对list排序,实现新的比较器
  18. Collections.sort(infos, new Comparator<Map.Entry<String, Integer>>(){
  19. @Override
  20. public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
  21. return o1.getValue() - o2.getValue();
  22. }
  23. });
  24. //申明新的有序 map,根据放入的数序排序
  25. Map<String, Integer> lhm = new LinkedHashMap<String, Integer>();
  26. //遍历比较过后的map,将结果放到LinkedHashMap
  27. for(Map.Entry<String, Integer> entry:infos){
  28. lhm.put(entry.getKey(), entry.getValue());
  29. }
  30. //遍历LinkedHashMap,打印值
  31. System.out.println("after sort");
  32. for(Map.Entry<String, Integer> entry:lhm.entrySet()){
  33. System.out.println(entry.getKey()+"->"+entry.getValue());
  34. }
  35. }
  36. }

结果:

before sort

d->4

e->5

b->2

c->3

a->1

after sort

a->1

b->2

c->3

d->4

e->5

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读