(一)List的自定义排序
List分为LinkedList和ArrayList两种,但它们在排序方法上并没有区别,下面以ArrayList为例,如需LinkedList,只需将关键字ArrayList改为LinkedList。
1、调用Collections类中的sort函数进行自定义排序。
package Test; import java.util.*; public class Main { public static void main(String[] args) { List<String> strlist = new ArrayList<String>(); strlist.add("b"); strlist.add("c"); strlist.add("a"); System.out.println("排序前:" + strlist); // 调用Collections类中的sort函数进行自定义排序。 Collections.sort(strlist, new Comparator<String>() { @Override public int compare(String o1, String o2) { if (o1.compareTo(o2) > 0) { return 1; } else { return -1; } } }); System.out.println("排序后:" + strlist); } }
2、在类的外部定义排序类,适用于需要多种排序的时候(比如学生类,我想先用姓名排序,再用年龄排序,再用学号排序……)
package Test; import java.util.*; public class Main { public static void main(String[] args) { List<String> strlist = new ArrayList<String>(); strlist.add("b"); strlist.add("c"); strlist.add("a"); System.out.println("排 序 前:" + strlist); // 在外部定义排序类进行排序 Collections.sort(strlist, new SortAscending()); System.out.println("升序排序后:" + strlist); Collections.sort(strlist, new SortDescending()); System.out.println("降序排序后:" + strlist); } } class SortAscending implements Comparator { @Override public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; if (s1.compareTo(s2) > 0) { return 1; } else { return -1; } } } class SortDescending implements Comparator { @Override public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; if (s1.compareTo(s2) > 0) { return -1; } else { return 1; } } }
(二)Set的自定义排序
首先说明一点:HashSet是“无序的”(它是依据哈希码进行默认排序的),TreeSet是有序的(默认升序)
1、第一种方法,将Set内的元素赋给一个List,然后调用List的排序方法。
package Test; import java.util.*; public class Main { public static void main(String[] args) { Set<String> strset = new HashSet<String>();//TreeSet相同 strset.add("b"); strset.add("c"); strset.add("a"); //定义一个List,将Set内的元素赋给List,然后调用List的排序方法 List<String> templist = new ArrayList<String>(strset); Collections.sort(templist);//可根据上文自定义 } }
2、直接定义TreeSet,调用其构造方法TreeSet(Comparator<? super E> comparator) 直接进行自定义排序
package Test; import java.util.*; public class Main { public static void main(String[] args) { Set<String> strset = new TreeSet<String>(new SortDescending()); strset.add("b"); strset.add("c"); strset.add("a"); System.out.println("直接排序:" + strset); } } class SortDescending implements Comparator { @Override public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; if (s1.compareTo(s2) > 0) { return -1; } else { return 1; } } }
(三)Map的自定义排序
map与set类似,TreeMap也是默认排好序的(以键值升序),HashMap是无序的
1、用一个辅助List
package Test; import java.util.*; import java.util.Map.Entry; public class Main { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("d", 2); map.put("c", 1); map.put("b", 1); map.put("a", 3); List<Map.Entry<String, Integer>> templist = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(templist, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { return (o2.getValue() - o1.getValue()); //return (o1.getKey()).toString().compareTo(o2.getKey()); } }); for (int i = 0; i < templist.size(); i++) { String id = templist.get(i).toString(); System.out.println(id); } } }
2、和TreeSet类似,直接调用TreeMap的构造方法
package Test; import java.util.*; import java.util.Map.Entry; public class Main { public static void main(String[] args) { Map<String, Integer> map = new TreeMap<String, Integer>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); //return (o1.getKey()).toString().compareTo(o2.getKey()); } }); map.put("d", 2); map.put("c", 1); map.put("b", 1); map.put("a", 3); Set<String> keySet = map.keySet(); Iterator<String> it = keySet.iterator(); while(it.hasNext()) { String key=it.next(); System.out.println(key+":"+map.get(key)); } } }