首页 > 编程 > 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中的排序问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表