有的時候需要對數組裡的element進行排序。當然可以自己編寫合適的排序方法,但既然java包裡有內建的Arrays.sort排序方法,在
數組元素比較少的時候為何不用?
Sorting an Array 1. 數字排序 int[] intArray = new int[] { 4, 1, 3, -23
};
Arrays.sort(intArray);
輸出: [-23, 1, 3, 4]
2. 字串排序,先大寫後小寫 String[] strArray = new String[] { "z", "a", "C" };
Arrays.sort(strArray);
輸出: [C, a, z]
3. 嚴格按字母表順序排序,也就是忽略大小寫排序 Case-insensitive sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
輸出: [a, C, z]
4. 反向排序, Reverse-order sort
Arrays.sort(strArray, Collections.reverseOrder());
輸出:[z, a, C]
5. 忽略大小寫反向排序 Case-insensitive reverse-order sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(Arrays.asList(strArray));
輸出: [z, C, a]
java初學者最常見的錯誤思想,就是試圖去寫一些方法來完成數組的排序功能,其實,數組排序功能,在java的api裡面早已實現,我們沒有
必要去重複製造輪子。
Arrays類有一個靜態方法sort,利用這個方法我們可以傳入我們要排序的數組進去排序,因為我們傳入的是一個數組的引用,所以排序完成的
結果也通過這個引用的來更改數組.對於整數、字串排序,jdk提供了預設的實現,如果要對一個對象數組排序,則要自己實現
java.util.Comparator介面。
package com.gjh.gee.arrays;<br />import java.util.Arrays;<br />public class ArraySortDemo {<br />public void sortIntArray() {<br />int[] arrayToSort = new int[] { 48, 5, 89, 80, 81, 23, 45, 16, 2 };<br />System.out.println("排序前");<br />for (int i = 0; i < arrayToSort.length; i++)<br />System.out.println(arrayToSort[i]);<br />// 調用數組的靜態排序方法sort<br />Arrays.sort(arrayToSort);<br />System.out.println("排序後");<br />for (int i = 0; i < arrayToSort.length; i++)<br />System.out.println(arrayToSort[i]);<br />}<br />public void sortStringArray() {<br />String[] arrayToSort = new String[] { "Oscar", "Charlie", "Ryan",<br />"Adam", "David" };<br />System.out.println("排序前");<br />for (int i = 0; i < arrayToSort.length; i++)<br />System.out.println(arrayToSort[i]);<br />System.out.println("排序後");<br />// 調用數組的靜態排序方法sort<br />Arrays.sort(arrayToSort);<br />for (int i = 0; i < arrayToSort.length; i++)<br />System.out.println(arrayToSort[i]);<br />}<br />public void sortObjectArray() {<br />Dog o1 = new Dog("dog1", 1);<br />Dog o2 = new Dog("dog2", 4);<br />Dog o3 = new Dog("dog3", 5);<br />Dog o4 = new Dog("dog4", 2);<br />Dog o5 = new Dog("dog5", 3);<br />Dog[] dogs = new Dog[] { o1, o2, o3, o4, o5 };<br />System.out.println("排序前");<br />for (int i = 0; i < dogs.length; i++) {<br />Dog dog = dogs[i];<br />System.out.println(dog.getName());<br />}<br />Arrays.sort(dogs, new ByWeightComparator());<br />System.out.println("排序後:");<br />for (int i = 0; i < dogs.length; i++) {<br />Dog dog = dogs[i];<br />System.out.println(dog.getName());<br />}<br />}<br />public static void main(String[] args) {<br />ArraySortDemo t = new ArraySortDemo();<br />t.sortIntArray();<br />t.sortStringArray();<br />t.sortObjectArray();<br />}<br />}<br />
package com.gjh.gee.arrays;<br />public class Dog {<br />private String name;<br />private int weight;<br />public Dog(String name, int weight) {<br />this.setName(name);<br />this.weight = weight;<br />}<br />public int getWeight() {<br />return weight;<br />}<br />public void setWeight(int weight) {<br />this.weight = weight;<br />}<br />public void setName(String name) {<br />this.name = name;<br />}<br />public String getName() {<br />return name;<br />}<br />}<br />
package com.gjh.gee.arrays;<br />import java.util.Comparator;<br />public class ByWeightComparator implements Comparator {<br />public final int compare(Object pFirst, Object pSecond) {<br />int aFirstWeight = ((Dog) pFirst).getWeight();<br />int aSecondWeight = ((Dog) pSecond).getWeight();<br />int diff = aFirstWeight - aSecondWeight;<br />if (diff > 0)<br />return 1;<br />if (diff < 0)<br />return -1;<br />else<br />return 0;<br />}<br />}
下面補充一個Collections.sort排序,原理和Arrays.sort差不多。
//一個POJO例子<br />class User {<br /> String name;<br /> String age;</p><p> public User(String name,String age){<br /> this.name=name;<br /> this.age=age;<br /> }<br /> public String getAge() {<br /> return age;<br /> }<br /> public void setAge(String age) {<br /> this.age = age;<br /> }<br /> public String getName() {<br /> return name;<br /> }<br /> public void setName(String name) {<br /> this.name = name;<br /> }<br />}</p><p>//具體的比較類,實現Comparator介面<br />import java.util.Comparator;<br />import java.util.List;<br />import java.util.ArrayList;<br />import java.util.Collections;<br />public class ComparatorUser implements Comparator{<br /> public int compare(Object arg0, Object arg1) {<br /> User user0=(User)arg0;<br /> User user1=(User)arg1;<br /> //首先比較年齡,如果年齡相同,則比較名字<br /> int flag=user0.getAge().compareTo(user1.getAge());<br /> if(flag==0){<br /> return user0.getName().compareTo(user1.getName());<br /> }else{<br /> return flag;<br /> }<br /> }</p><p>}</p><p>//測試類別<br />public class SortTest {</p><p> public static void main(String[] args){<br /> List userlist=new ArrayList();<br /> userlist.add(new User("dd","4"));<br /> userlist.add(new User("aa","1"));<br /> userlist.add(new User("ee","5"));<br /> userlist.add(new User("bb","2"));<br /> userlist.add(new User("ff","5"));<br /> userlist.add(new User("cc","3"));<br /> userlist.add(new User("gg","6"));</p><p> ComparatorUser comparator=new ComparatorUser();<br /> Collections.sort(userlist, comparator);</p><p> for (int i=0;i<userlist.size();i++){<br /> User user_temp=(User)userlist.get(i);<br /> System.out.println(user_temp.getAge()+","+user_temp.getName());<br /> }</p><p> }<br />}
//首先年齡排序,如果年齡相同,則按名字排序
結果:
1, aa
2, bb
3, cc
4, dd
5, ee //注意:同樣是5歲的人,則比較名字(ee,ff),然後排序
5, ff
6, gg