java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
下面小编就为大家带来一篇浅谈 java Collection 中的排序问题小编觉得挺不错的, 现在就分享给大家, 也给大家做个参考一起跟随小编过来看看吧
这里讨论 listsetmap 的排序, 包括按照 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 进行排序
来源: http://www.phperz.com/article/18/0219/359205.html