国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

淺談java Collection中的排序問題

2019-11-26 13:27:52
字體:
來源:轉載
供稿:網友

這里討論list、set、map的排序,包括按照map的value進行排序。

1)list排序

list排序可以直接采用Collections的sort方法,也可以使用Arrays的sort方法,歸根結底Collections就是調用Arrays的sort方法。

public static <T> void sort(List<T> list, Comparator<? super T> c) {   Object[] a = list.toArray();   Arrays.sort(a, (Comparator)c);   ListIterator i = list.listIterator();   for (int j=0; j<a.length; j++) {     i.next();     i.set(a[j]);   }   } 

如果是自定義對象,需要實現Comparable接口使得對象自身就有“比較”的功能,當然我們也可以在外部使用Comparator來規定其排序。

例如:

package com.fox;  /**  * @author huangfox  * @desc  */public class User implements Comparable<User> {    private String name;   private int age;    public User() {   }    public User(String name, int age) {     super();     this.name = name;     this.age = age;   }    @Override  public String toString() {     return "name:" + name + ",age:" + age;   }    public String getName() {     return name;   }    public void setName(String name) {     this.name = name;   }    public int getAge() {     return age;   }    public void setAge(int age) {     this.age = age;   }    @Override  public int compareTo(User o) {     if (o.age < this.age)       return 1;     else if (o.age > this.age)       return -1;     else      return 0;   }    /**    * @param args    */  public static void main(String[] args) {     User u1 = new User("fox", 11);     User u2 = new User("fox2", 21);     System.out.println(u2.compareTo(u1));   }  }

排序:

// List<User> us = new ArrayList<User>();     List<User> us = new LinkedList<User>();     us.add(new User("f5", 12));     us.add(new User("f2", 22));     us.add(new User("f3", 2));     us.add(new User("f4", 14));     us.add(new User("f5", 32));     us.add(new User("f4", 12));     us.add(new User("f7", 17));     us.add(new User("f8", 52));     System.out.println(us.toString());     long bt = System.nanoTime();     Collections.sort(us, new Comparator<User>() {        @Override      public int compare(User o1, User o2) {         if (o1.getAge() < o2.getAge())           return -1;         else if (o1.getAge() > o2.getAge())           return 1;         else          return o1.getName().compareTo(o2.getName());       }     });     long et = System.nanoTime();     System.out.println(et - bt);     System.out.println(us.toString());

當然這里可以直接Collections.sort(us),這里用Comparator對User自身的比較方法compareTo做了一點點優化(對相同年齡的人根據用戶名排序,String的排序)。

簡單提一下,Arrays的排序采用的是插入排序和歸并排序,當數組長度較小時直接插入排序。

2)set排序

set包括HashSet和TreeSet,HashSet是基于HashMap的,TreeSet是基于TreeMap的。

TreeMap是用紅黑樹實現,天然就具有排序功能,“天然就具有排序功能”是指它擁有升序、降序的迭代器。

那么HashSet怎么排序呢?我們可以將HashSet轉成List,然后用List進行排序。

例如:

Set<User> us = new HashSet<User>();     // Set<User> us = new TreeSet<User>();     // Set<User> us = new TreeSet<User>(new Comparator<User>() {     //     // @Override     // public int compare(User o1, User o2) {     // if (o1.getAge() < o2.getAge())     // return -1;     // else if (o1.getAge() > o2.getAge())     // return 1;     // else     // return o1.getName().compareTo(o2.getName());     // }     // });     us.add(new User("f5", 12));     us.add(new User("f2", 22));     us.add(new User("f3", 2));     us.add(new User("f4", 14));     us.add(new User("f5", 32));     us.add(new User("f4", 12));     us.add(new User("f7", 17));     us.add(new User("f8", 52));     // set -> array     List<User> list = new ArrayList<User>(us);     System.out.println(list);     Collections.sort(list);     System.out.println(list);

也可以將HashSet轉換成數組用Arrays排序。

3)map排序

map包括HashMap和TreeMap,上面已經提過,TreeMap用紅黑樹實現,天然具有排序功能。

那么HashMap怎么按“key”排序呢?方法很簡單,用HashMap來構造一個TreeMap。

Map<String, Integer> us = new HashMap<String, Integer>();     // Map<String, Integer> us = new TreeMap<String, Integer>();     us.put("f1", 12);     us.put("f2", 13);     us.put("f5", 22);     us.put("f4", 42);     us.put("f3", 15);     us.put("f8", 21);     us.put("f6", 123);     us.put("f7", 1);     us.put("f9", 19);     System.out.println(us.toString());     System.out.println(new TreeMap<String, Integer>(us));

怎么按照“value”進行排序?

// 按照value排序     Set<Entry<String, Integer>> ks = us.entrySet();     List<Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(         ks);     Collections.sort(list, new Comparator<Entry<String, Integer>>() {        @Override      public int compare(Entry<String, Integer> o1,           Entry<String, Integer> o2) {         if (o1.getValue() < o2.getValue())           return -1;         else if (o1.getValue() > o2.getValue())           return 1;         return 0;       }     });     System.out.println(list);

將map的Entry提出成set結構,然后將set轉成list,最后按照list進行排序。

以上這篇淺談java Collection中的排序問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大化| 大宁县| 龙井市| 洪洞县| 芦溪县| 区。| 兰西县| 筠连县| 永年县| 绍兴市| 郓城县| 桦甸市| 长顺县| 阿克陶县| 阳高县| 监利县| 蒙阴县| 濮阳市| 板桥市| 广元市| 新龙县| 聂荣县| 会东县| 和田县| 琼海市| 承德市| 北川| 保山市| 遂川县| 宁陵县| 绥中县| 茌平县| 蒙自县| 始兴县| 迭部县| 名山县| 甘南县| 任丘市| 济源市| 来安县| 贡觉县|