Collections的sort方法 排序
2014-03-17 14:23
696 查看
通过Collection的sort方法对List进行排序,有两种方法实现:
1. List<T>中的对象应继承Comparable接口,并实现其compareTo方法
//需要比较的对象类PersonH
[java]
view plaincopyprint?
public class PersonH implements Comparable<PersonH> { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } @Override public int compareTo(PersonH o) { // TODO Auto-generated method stub return this.getLevel().compareTo(o.getLevel()); } }
[java]
view plaincopyprint?
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); Collections.sort(personList);//排序 for(PersonH personH : personList) //输出排序后结果 { System.out.println(personH.getLevel()); } } }
2. 根据Collection.sort重载之,来实现
//PersonH类
[java]
view plaincopyprint?
public class PersonH { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } }
[java]
view plaincopyprint?
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); //这里可以更加灵活地指定比较策略,第一种实现方法是在要比较对象的类中就固定了比较策略。 Collections.sort(personList,new Comparator<PersonH>() { public int compare(PersonH p1,PersonH p2) { return p1.getLevel().compareTo(p2.getLevel()); } }); for(PersonH personH : personList) { System.out.println(personH.getLevel()); } } }
下面看一下该方法是如何进行排序的:
对于第一种:
[java]
view plaincopyprint?
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
[java]
view plaincopyprint?
public static void sort(Object[] a) {
Object[] aux = (Object[])a.clone();
mergeSort(aux, a, 0, a.length, 0);
}
对于第二种:
[java]
view plaincopyprint?
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]);
}
}
[java]
view plaincopyprint?
public static <T> void sort(T[] a, Comparator<? super T> c) { T[] aux = (T[])a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0); else mergeSort(aux, a, 0, a.length, 0, c); }
首先看是否指定排序策略,如果没有,则和第一种走一样的逻辑;否则进行指定比较策略的归并排序。
mergeSort函数的源代码可以参考java.util.Arrays类。
1. List<T>中的对象应继承Comparable接口,并实现其compareTo方法
//需要比较的对象类PersonH
[java]
view plaincopyprint?
public class PersonH implements Comparable<PersonH> { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } @Override public int compareTo(PersonH o) { // TODO Auto-generated method stub return this.getLevel().compareTo(o.getLevel()); } }
public class PersonH implements Comparable<PersonH> { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } @Override public int compareTo(PersonH o) { // TODO Auto-generated method stub return this.getLevel().compareTo(o.getLevel()); } }//Main类测试
[java]
view plaincopyprint?
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); Collections.sort(personList);//排序 for(PersonH personH : personList) //输出排序后结果 { System.out.println(personH.getLevel()); } } }
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); Collections.sort(personList);//排序 for(PersonH personH : personList) //输出排序后结果 { System.out.println(personH.getLevel()); } } }这中方式相当与类personH具备了指定的基本排序策略,因它实现了compareTo方法
2. 根据Collection.sort重载之,来实现
//PersonH类
[java]
view plaincopyprint?
public class PersonH { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } }
public class PersonH { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } }//Main类
[java]
view plaincopyprint?
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); //这里可以更加灵活地指定比较策略,第一种实现方法是在要比较对象的类中就固定了比较策略。 Collections.sort(personList,new Comparator<PersonH>() { public int compare(PersonH p1,PersonH p2) { return p1.getLevel().compareTo(p2.getLevel()); } }); for(PersonH personH : personList) { System.out.println(personH.getLevel()); } } }
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); //这里可以更加灵活地指定比较策略,第一种实现方法是在要比较对象的类中就固定了比较策略。 Collections.sort(personList,new Comparator<PersonH>() { public int compare(PersonH p1,PersonH p2) { return p1.getLevel().compareTo(p2.getLevel()); } }); for(PersonH personH : personList) { System.out.println(personH.getLevel()); } } }
下面看一下该方法是如何进行排序的:
对于第一种:
[java]
view plaincopyprint?
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } }
[java]
view plaincopyprint?
public static void sort(Object[] a) {
Object[] aux = (Object[])a.clone();
mergeSort(aux, a, 0, a.length, 0);
}
public static void sort(Object[] a) { Object[] aux = (Object[])a.clone(); mergeSort(aux, a, 0, a.length, 0); }可以看出是直接调用归并排序进行的。
对于第二种:
[java]
view plaincopyprint?
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]);
}
}
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]); } }
[java]
view plaincopyprint?
public static <T> void sort(T[] a, Comparator<? super T> c) { T[] aux = (T[])a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0); else mergeSort(aux, a, 0, a.length, 0, c); }
public static <T> void sort(T[] a, Comparator<? super T> c) { T[] aux = (T[])a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0); else mergeSort(aux, a, 0, a.length, 0, c); }总之,两种方式都是通过mergeSort实现的。
首先看是否指定排序策略,如果没有,则和第一种走一样的逻辑;否则进行指定比较策略的归并排序。
mergeSort函数的源代码可以参考java.util.Arrays类。
相关文章推荐
- Collections.sort对List排序的两种方法
- Collections.sort()方法对象排序
- ArrayList中元素排序方法:Collections.sort(list)
- 用Java集合中的Collections.sort方法如何对list排序(两种方法)
- java Collections.sort()实现List排序的默认方法和自定义方法
- 使用Collections.sort()方法扩展list集合中的数据并对其进行排序
- Java-Collections的sort方法对list进行排序
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 集合中按照商品价格排序,按照学生编号排序,Collections集合里的sort方法,Comparator<T>接口,Comparable<T>接口,
- Java Collections.sort方法对list集合排序
- java Collections.sort()实现List排序的默认方法和自定义方法
- Java中使用Collections.sort()方法对数字和字符串泛型的LIst进行排序
- Collections.sort方法对list排序的两种方式
- Collections.sort自定义排序的使用方法
- Collections.sort()排序使用方法
- Hash表 collections工具 sort排序方法
- Java - TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
- Collections.sort自定义排序的使用方法
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?