Here we discuss the sorting of list, set, and map, including sorting by map value.
1) List sorting
List sorting can directly use the sort method of Collections, or the sort method of Arrays. In the final analysis, Collections is to call the sort method of Arrays.
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]); } }If it is a custom object, you need to implement the Comparable interface so that the object itself has the function of "comparing". Of course, we can also use Comparator externally to specify its sorting.
For example:
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)); } }Sort by:
// 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());Of course, here you can directly collect and sort (us). Comparator is used to optimize the User's own comparison method compareTo (sorting people of the same age according to username and sorting String).
To mention simply, Arrays sorting uses insertion sorting and merge sorting, and insertion sorting directly when the array length is small.
2) Set sort
The set includes HashSet and TreeSet. HashSet is based on HashMap and TreeSet is based on TreeMap.
TreeMap is implemented using red and black trees, and naturally has sorting function. "Naturally has sorting function" means that it has iterators in ascending and descending order.
So how do you sort HashSet? We can convert the HashSet to a List and sort it with List.
For example:
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);You can also convert HashSet into an array and sort it with Arrays.
3) Map sorting
map includes HashMap and TreeMap. As mentioned above, TreeMap is implemented with red and black trees and naturally has sorting functions.
So how do you sort HashMap by "key"? The method is very simple, use HashMap to construct a 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));How to sort by "value"?
// Sort by 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);Propose the map's Entry into a set structure, then convert the set into a list, and finally sort it according to the list.
The above brief discussion on the sorting issue in Java Collection is all the content I share with you. I hope you can give you a reference and I hope you can support Wulin.com more.