(轉載)java list排序
1、簡介
這個和數組的排序又不一樣了。
其實Java針對數組和List的排序都有實現,對數組而言,你可以直接使用Arrays.sort,對於List和Vector而言,你可以使用Collections.sort方法。
Java API針對集合類型的排序提供了2個方法:
java.util.Collections.sort(java.util.List) java.util.Collections.sort(java.util.List, java.util.Comparator)
如果集合裏面的元素都是相同類型的,並且實現了Comparable接口,那麽可以直接調用第一個方法。
如果你有其它的排序的想法,比如你不想按照自然排序進行,還可以傳一個Comparator過去,比如反向。
元素不相同的情況比較復雜,可以暫時不用考慮。
2、通過實現Comparable接口來實現list的排序
假如現在我們有一個Person類的list集合,要讓其按照一個Order屬性進行排序,我們可以讓Person類實現Comparable接口,重寫其CompareTo方法即可。具體實現如下:
1)、Person實體類
public class Person implements Comparable<Person> { private String name;private Integer order; /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the order */public Integer getOrder() { return order; } /** * @param order * the order to set */ public void setOrder(Integer order) { this.order = order; } @Override public int compareTo(Person arg0) { return this.getOrder().compareTo(arg0.getOrder()); //這裏定義你排序的規則。 } }
通過重寫Comparable接口的compareTo方法,可以讓程序按照我們想要的排列方式進行排序,如:這裏我讓Person按照order屬性升序排序。
2)、測試類
public static void main(String[] args) { //初始化數據 List<Person> listA = new ArrayList<Person>(); Person p1 = new Person(); Person p2 = new Person(); Person p3 = new Person(); p1.setName("name1"); p1.setOrder(1); p2.setName("name2"); p2.setOrder(2); p3.setName("name3"); p3.setOrder(3); listA.add(p2); listA.add(p1); listA.add(p3); //排序 Collections.sort(listA); //打印排序後的Person for (Person p : listA) { System.out.println(p.getName()); } }
3)、結果:
name1 name2 name3
3、通過重載Collections.sort方法
直接重載java.util.Collections.sort(java.util.List, java.util.Comparator) 方法。可以靈活的修改我們排序的方式,具體實現如下:
1)、Person實體類
和上面的類相同,但沒實現Comparable接口
public class Person { private String name; private Integer order; /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the order */ public Integer getOrder() { return order; } /** * @param order * the order to set */ public void setOrder(Integer order) { this.order = order; } }
2)、測試類
public static void main(String[] args) { List<Person> listA = new ArrayList<Person>(); Person p1 = new Person(); Person p2 = new Person(); Person p3 = new Person(); p1.setName("name1"); p1.setOrder(1); p2.setName("name2"); p2.setOrder(2); p3.setName("name3"); p3.setOrder(3); listA.add(p2); listA.add(p1); listA.add(p3); //直接在這裏添加我們的排序規則 Collections.sort(listA, new Comparator<Person>() { public int compare(Person arg0, Person arg1) { return arg0.getOrder().compareTo(arg1.getOrder()); } }); for (Person p : listA) { System.out.println(p.getName()); } }
從上面看到,直接在Conllections.sort()方法中重寫了一個Comparator接口,可以在不同的地方使用Person集合的不同排序方法。如上面還是按照Person的order屬性升序排列,我只要改寫該方法,就可以在其他地方按照其他的規則對我的list集合進行排序,但是這樣子代碼看起來會比前面的那種方式繁瑣。
3)、結果
name1 name2 name3
致謝:感謝您的閱讀!
4.擴展:按照兩個字段排序
比如先按照名字排序,如果名字相同,按照小名排序;例子如下:
package com.cy.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Student implements Comparable<Student>{ private int id; private String name; //名字 private String sname; //小名 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Student(int id, String name, String sname) { super(); this.id = id; this.name = name; this.sname = sname; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sname=" + sname + "]"; } /** * student類的排序方法 * 先按照name排序,如果name相同按照sname排序 */ @Override public int compareTo(Student o) { int r1 = this.getName().compareToIgnoreCase(o.getName()); int r2 = this.getSname().compareToIgnoreCase(o.getSname()); return r1>0?1: r1<0?-1: r2>0?1: r2<0?-1:0; } //測試程序 public static void main(String[] args) { Student s1 = new Student(2,"zhangsan","z"); Student s2 = new Student(1, "zhangsan","b"); Student s3 = new Student(3, "zhangsan","y"); Student s4 = new Student(0, "lisi","s"); Student s5 = new Student(5, "wangwu","w"); Student s6 = new Student(10, "wangwu","xx"); Student s7 = new Student(8, "aming","ming"); List<Student> list = new ArrayList<Student>(); list.add(s1);list.add(s2);list.add(s3);list.add(s4); list.add(s5);list.add(s6);list.add(s7); Collections.sort(list); for(Student s : list){ System.out.println(s); } } }
打印:
Student [id=8, name=aming, sname=ming] Student [id=0, name=lisi, sname=s] Student [id=5, name=wangwu, sname=w] Student [id=10, name=wangwu, sname=xx] Student [id=1, name=zhangsan, sname=b] Student [id=3, name=zhangsan, sname=y] Student [id=2, name=zhangsan, sname=z]
(轉載)java list排序