參考鏈接: Java程序的輸出| 18(重寫Override)
一道簡單程序題:
編寫一個程序,輸入學生的姓名、分數信息,要求程序按照成績降序排序后并輸出。
實現方法有很多
?
方法一? ??
?
public class ScoreSort2?
{
? ? private String name;
? ? private long grade;
?
? ? public long getGrade()?
? ? {
? ? ? ? return grade;
? ? }
? ? public void setGrade(long grade)?
? ? {
? ? ? ? this.grade = grade;
? ? }
? ? public String getName()
? ? {
? ? ? ? return name;
? ? }
? ? public void setName(String name)
? ? {
? ? ? ? this.name = name;
? ? }
?
? ? public String toString()
? ? {
? ? ? ? return this.name;
? ? }
? ? public static void main(String[] args)?
? ? {
? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? System.out.println("情輸入學生人數:");
? ? ? ? int num = sc.nextInt();? //學生個數
? ? ? ? ScoreSort2 message[] = new ScoreSort2[num]; //成績信息的條數
? ? ? ? for(int i = 0; i < message.length; i++)
? ? ? ? {
? ? ? ? ? ? message[i] = new ScoreSort2();
? ? ? ? ? ? System.out.println("請輸入第" + (i+1) + "個學生的姓名");
? ? ? ? ? ? String name = sc.next();
? ? ? ? ? ? message[i].setName(name);
? ? ? ? ? ? System.out.println("請輸入第" + (i+1) + "個學生的成績");
? ? ? ? ? ? long grade = sc.nextLong();
? ? ? ? ? ? message[i].setGrade(grade);
? ? ? ? }
? ? ? ? System.out.println("統計結果如下:");
? ? ? ? for(int i = 0; i < message.length; i++)
? ? ? ? {
? ? ? ? ? ? for(int j = i+1; j <message.length; j++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(message[i].getGrade() < message[j].getGrade())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ScoreSort2 s = new ScoreSort2();
? ? ? ? ? ? ? ? ? ? s = message[i];
? ? ? ? ? ? ? ? ? ? message[i] = message[j];
? ? ? ? ? ? ? ? ? ? message[j] = s;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? for(int i=0; i < message.length; i++)
? ? ? ? {
? ? ? ? ? ? System.out.println("姓名:"+message[i].getName()+"成績:"+message[i].getGrade());
? ? ? ? }
? ? }
}
方法二
?
public class ScoreSort3?
{
?
? ? public static void main(String[] args)?
? ? {
? ? ? ? Scanner input = new Scanner(System.in);????????
? ? ? ? System.out.println("請輸入學生個數");
? ? ? ? int num = input.nextInt();
? ? ? ? scoreData[] arr = new scoreData[num];
? ??????
? ? ? ? for(int i=0;i<num;i++)
? ? ? ? {
? ? ? ? ? ? System.out.println("請輸入第" + (i+1) +"個學生的姓名:") ;
? ? ? ? ? ? String stuName = input.next();//將nextLine改為next nextline只讀入了數字 未讀入換行
? ? ? ? ? ? System.out.println("請輸入第" + (i+1) +"個學生的成績:");
? ? ? ? ? ? String stuScore = input.next();
? ? ? ? ? ? arr[i] = new scoreData(stuName,stuScore);
? ? ? ? }
? ? ? ? System.out.println("-----------------------");
? ??????
? ? ? ? System.out.println("降序排序結果輸出:");
? ? ? ? Arrays.sort(arr);
? ? ? ? for(int i=0;i<arr.length;i++)
? ? ? ? {
? ? ? ? ? ? System.out.println(arr[i]);
? ? ? ? }????????
? ? }
}
?
class? scoreData implements Comparable
{
? ? private String name;
? ? private String score;
? ??
? ? public scoreData(String name, String score)
? ? {
? ? ? ? this.name = name;
? ? ? ? this.score = score;
? ? }
? ??
? ? //降序排序
? ? public int compareTo(Object o)
? ? {
? ? ? ? scoreData s = (scoreData)o;
? ? ? ? if(this.score.compareTo(s.score)<0)//String類型的大小比較
? ? ? ? {
? ? ? ? ? ? return 1;
? ? ? ? }
? ? ? ? else if(this.score.compareTo(s.score)>0)
? ? ? ? {
? ? ? ? ? ? return -1;
? ? ? ? }
? ? ? ? return 0;
? ? }
? ??
? ? @Override
? ? public String toString(){//重寫toString方法
? ? ? ? return "姓名:" + this.name + " 成績:" + this.score;
? ? }
}
Arrays.sort
public static void sort(Object[] a)
?
?
? 根據元素的
? 自然順序對指定對象數組按升序進行排序。數組中的所有元素都必須實現
? Comparable 接口。此外,數組中的所有元素都必須是
? 可相互比較的(也就是說,對于數組中的任何
? e1 和?
? e2 元素而言,
? e1.compareTo(e2) 不得拋出?
? ClassCastException)。
? 保證此排序是穩定的:不會因調用 sort 方法而對相等的元素進行重新排序。
??
? 該排序算法是一個經過修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,則忽略合并)。此算法提供可保證的 n*log(n) 性能。
??
? ?
? ?
? ? 類型參數:
? ?
??
? T - 可以與此對象進行比較的那些對象的類型
?
?
?
接口 Comparable<T>
?
?
?
? 類型參數:
?
?
? T - 可以與此對象進行比較的那些對象的類型
?
?
public interface Comparable<T>
?
此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。
實現此接口的對象列表(和數組)可以通過 Collections.sort(和Arrays.sort)進行自動排序。實現此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
對于類 C 的每一個 e1 和 e2 來說,當且僅當 e1.compareTo(e2) == 0 與e1.equals(e2) 具有相同的 boolean 值時,類 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類的實例,即使e.equals(null) 返回 false,e.compareTo(null) 也將拋出 NullPointerException。
建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因為在使用自然排序與 equals 不一致的元素(或鍵)時,沒有顯式比較器的有序集合(和有序映射表)行為表現“怪異”。尤其是,這樣的有序集合(或有序映射表)違背了根據equals 方法定義的集合(或映射表)的常規協定。
例如,如果將兩個鍵 a 和 b 添加到沒有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那么第二個add 操作將返回 false(有序集合的大小沒有增加),因為從有序集合的角度來看,a 和 b 是相等的。
實際上,所有實現 Comparable 的 Java 核心類都具有與 equals 一致的自然排序。java.math.BigDecimal 是個例外,它的自然排序將值相等但精確度不同的BigDecimal 對象(比如 4.0 和 4.00)視為相等。
從數學上講,定義給定類 C 上自然排序的關系式 如下:
? ? ? {(x, y)|x.compareTo(y) <= 0}。
?
整體排序的
商
?是:
?
? ? ? {(x, y)|x.compareTo(y) == 0}。
?
它直接遵循?
compareTo
?的協定,商是?
C
?的
等價關系
,自然排序是?
C
?的
整體排序
。當說到類的自然排序
與 equals 一致
?時,是指自然排序的商是由類的
equals(Object)
?方法定義的等價關系。
?
? ? {(x, y)|x.equals(y)}。
此接口是 Java Collections Framework 的成員。
?
?
?
?
? 從以下版本開始:
?
?
? 1.2
?
?
? 另請參見:
?
?
? Comparator
?
?
?
?
?
?
方法摘要intcompareTo(T o)比較此對象與指定對象的順序。
方法詳細信息
?
?
compareTo
int compareTo(T o)
?
?
? 比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數。
? 實現類必須確保對于所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的關系。(這意味著如果y.compareTo(x)拋出一個異常,則 x.compareTo(y) 也要拋出一個異常。)
? 實現類還必須確保關系是可傳遞的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味著 x.compareTo(z)>0。
? 最后,實現者必須確保 x.compareTo(y)==0 意味著對于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 強烈推薦(x.compareTo(y)==0) == (x.equals(y)) 這種做法,但并不是 嚴格要求這樣做。一般來說,任何實現Comparable 接口和違背此條件的類都應該清楚地指出這一事實。推薦如此闡述:“注意:此類具有與 equals 不一致的自然排序。”
? 在前面的描述中,符號 sgn(expression) 指定 signum 數學函數,該函數根據expression 的值是負數、零還是正數,分別返回-1、0 或 1 中的一個值。
??
?
?
??
? ?
? ? 參數:
? ?
? ?
? ? o - 要比較的對象。
? ?
? ?
? ? 返回:
? ?
? ?
? ? 負整數、零或正整數,根據此對象是小于、等于還是大于指定對象。
? ?
? ?
? ? 拋出:
? ?
? ?
? ? ClassCastException - 如果指定對象的類型不允許它與此對象進行比較
? ?
??
?
?
?
?
另附上Arrays.sort用法:
? ? ? 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]
6、對象數組排序
要對一個對象數組排序 ,則要自己實現java.util.Comparator接口 例子: Common_User[] userListTemp=new Common_User[temp.size()]; Arrays.sort(userListTemp, new PinyinComparator()); PinyinComparator 實現了Comparator接口,重寫了compare方法,來告訴Arrays按照什么規則來比較兩個對象的大小。