利用compareTo方法進行字串比較排序

耶熊OVO發表於2020-10-28

**

利用compareTo方法進行字串比較排序

**

排序演算法

建立學生類,包含兩個屬性:姓名和學號。給出建構函式,輸入引數為學生學號,限制為整型型別,範圍在[0,999]之間。姓名由3位字元組成,由該學生的學號採用線性對映的方式獲取得到,線性對映函式為(見表1)
在這裡插入圖片描述
要求輸入一個範圍在[0,999]之間的整數,通過隨機產生的方式生成n個滿足上述要求的學生物件。並按照以下三種不同的排序方式完成所有物件的順序輸出:
(a) 按照學號的大小順序完成順序輸出,即給出兩個學生s和t,對應學號分別為:m和n,若滿足m>n,則要求先輸出t後輸出s;
(b) 按照學生對應學號的十位、個位、百位的大小優先順序完成順序輸出,即
給出兩個學生s和t,對應學號分別為:m和n,若m的十位數大於n的十位數,則先輸出m,若兩者相等,再比較m和n的個位數,相應小的物件先輸出;若兩位學生的十位、個位均相等,最後比較兩個學號的百位數,相應小的先輸出。如兩個學生的學號分別為:045和418,由於第二個學生的學號十位數1小於第一個學生的十位數4,需要先輸出第二個學生物件;
(c ) 按照學生對應學號的個位、百位、十位的大小優先順序完成順序輸出,即給出兩個學生s和t,對應學號分別為:m和n,若m的個位數大於n的個位數,則先輸出m,若兩者相等,再比較m和n的百位數,相應小的物件先輸出;若兩位學生的個位、百位均相等,最後比較兩個學號的十位數,相應小的先輸出。如兩個學生的學號分別為:248和418,由於兩位學生的個位數相等,需要再比較兩個學號的百位數,而需要先輸出第一個學生物件。

程式原始碼如下:

package sunhao;

import java.util.Scanner;


abstract class CompareTo{	//定義一個抽象類和抽象方法
	abstract public void compare(String [] str);	//該方法用於比較字串的大小
}
class Compare extends CompareTo{	//繼承上面抽象類並重寫父類的abstract方法
	public void compare(String [] m){	//三位數學號的字串作為引數傳入
		for(int i=0;i<m.length;i++) {
			for(int j=0;j<i;j++) {
				String str=String.valueOf(m[i]);
				String str1=String.valueOf(m[j]);
				int w=str.compareTo(str1);	//等長字串比較
				if(w<0) {	//按從小到大排序
					String temp=m[i];
					m[i]=m[j];
					m[j]=temp;
				}
			}
		}
		
	}
}
class Compare1 extends CompareTo{	//按十個百位進行比較
	public void compare(String [] m){
		String [] n=new String[m.length];
		for(int r=0;r<m.length;r++) {
			int sno=Integer.parseInt(m[r]);
			int a=sno/100;
			int b=(sno%100)/10;
			int c=sno%10;
			int snoo=b*100+c*10+a;	//將原來的學號變成十個百位順序
			n[r]=String.format("%03d", snoo);
		}
		for(int i=0;i<m.length;i++) {
			for(int j=0;j<i;j++) {
				String str=String.valueOf(n[i]);
				String str1=String.valueOf(n[j]);
				int w=str.compareTo(str1);
				if(w<0) {
					String temp=n[i];
					n[i]=n[j];
					n[j]=temp;
				}
			}
		}
		for(int t=0;t<m.length;t++) {
			int sno=Integer.parseInt(n[t]);
			int a=sno/100;
			int b=(sno%100)/10;
			int c=sno%10;
			int snoo=c*100+a*10+b;	//比較完再將學號恢復
			m[t]=String.format("%03d", snoo);
		}
	}
}
class Compare2 extends CompareTo{	按個百十位進行比較
	public void compare(String [] m){
		String [] n=new String[m.length];
		for(int r=0;r<m.length;r++) {
			int sno=Integer.parseInt(m[r]);
			int a=sno/100;
			int b=(sno%100)/10;
			int c=sno%10;
			int snoo=c*100+a*10+b;
			n[r]=String.format("%03d", snoo);
		}
		for(int i=0;i<m.length;i++) {
			for(int j=0;j<i;j++) {
				String str=String.valueOf(n[i]);
				String str1=String.valueOf(n[j]);
				int w=str.compareTo(str1);
				if(w<0) {
					String temp=n[i];
					n[i]=n[j];
					n[j]=temp;
				}
			}
		}
		for(int t=0;t<m.length;t++) {
			m[t]=n[t];
			int sno=Integer.parseInt(m[t]);
			int a=sno/100;
			int b=(sno%100)/10;
			int c=sno%10;
			int snoo=b*100+c*10+a;
			m[t]=String.format("%03d", snoo);
		}
	}
}
class Repeat{	//隨機生成不重複的學號
	public void repeat(int [] sno){
		int i=0;
		while(true) {	//去除重複學號
			boolean flag=true;
			int no=(int)(Math.random()*1000);	//隨機生成0-999之間的數
			for(int j=0;j<sno.length;j++) {
				if(sno[j]==no) {
					flag=false;
					break;
				}
			}
			if(flag) {
				sno[i]=no;
				i++;
			}
			if(i>sno.length-1) {
				break;
			}
		}
	}
}
class Student{	//定義一個學生類
	String sname;	//學生的姓名
	int sno;	//學生的學號
	Student(String ssno){	//建構函式
		int sno=Integer.parseInt(ssno);
		String [] t= {"A","B","C","D","E","F","G","H","I","J"};	//定義一個字串陣列
		int a=sno/100;	//將三位數學號拆開(a代表百位)
		int b=(sno%100)/10;	//b代表十位
		int c=sno%10;	//c代表個位
		System.out.println("     "+t[a]+t[b]+t[c]);	//根據學生學號與姓名的對映關係,輸出該學號對應的學生姓名
	}
}
public class Test{	//主類
	public static void main(String args[]) {
		Scanner sc=new Scanner(System.in);	//Scanner類用於使用者的輸入
		System.out.println("請輸入學生個數:");
		try{	//try用於捕獲使用者輸入時的異常(如非數字),並來提示使用者重新輸入
			int number=sc.nextInt();	//輸入學生的個數
			if(number>=0&&number<=999) {	//學生的個數應為0-999之間
				int [] sno=new int[number];	//為這些學生建立一個學號陣列,存放學號(學號唯一)
				Repeat re=new Repeat();	//物件的宣告與例項化
				re.repeat(sno);	//呼叫Repeat類中的repeat方法
				String [] ssno=new String[number];	//存放三位數學號
				System.out.println("----------------------------------------------------------");
				System.out.println("(a)按照學號的大小順序完成順序輸出:");
				System.out.println("序號    "+"學號     "+"姓名");
				for(int k=0;k<sno.length;k++) {	//將隨機生成的學號全部變成三位數的字串
					ssno[k]=String.format("%03d", sno[k]);//0表示前面補0;digit表示要保留的數字位數;d表示引數為正數型別
				}
				Compare com=new Compare();
				com.compare(ssno);	//按順序比較
				for(int r=0;r<sno.length;r++) {	//輸出結果
					System.out.print(r+1);	//序號
					System.out.print("    "+ssno[r]);	//學號
					Student stu=new Student(ssno[r]);	//姓名
				}
				System.out.println("----------------------------------------------------------");
				System.out.println("(b)按照學生對應學號的十位、個位、百位的大小優先順序完成順序輸出:");
				System.out.println("序號    "+"學號     "+"姓名");
				for(int k=0;k<sno.length;k++) {
					ssno[k]=String.format("%03d", sno[k]);
				}
				Compare1 com1=new Compare1();
				com1.compare(ssno);
				for(int r=0;r<sno.length;r++) {
					System.out.print(r+1);
					System.out.print("    "+ssno[r]);
					Student stu1=new Student(ssno[r]);
				}
				System.out.println("----------------------------------------------------------");
				System.out.println("(c)按照學生對應學號的個位、百位、十位的大小優先順序完成順序輸出:");
				System.out.println("序號    "+"學號     "+"姓名");
				for(int k=0;k<sno.length;k++) {
					ssno[k]=String.format("%03d", sno[k]);
				}
				Compare2 com2=new Compare2();
				com2.compare(ssno);
				for(int r=0;r<sno.length;r++) {
					System.out.print(r+1);
					System.out.print("    "+ssno[r]);
					Student stu2=new Student(ssno[r]);
				}
			}else {	//當輸入不在0-999之間進行提醒
				System.out.println("請輸入0-999之間的數字!(包括0和999)");
			}
		}catch(Exception e) {	//捕獲異常並提醒
			System.out.println("親,您輸入的不是數字。請輸入0-999之間的數字!(包括0和999)");
		}
	}
}

執行結果:

請輸入學生個數:
6
----------------------------------------------------------
(a)按照學號的大小順序完成順序輸出:
序號    學號     姓名
1    117     BBH
2    140     BEA
3    222     CCC
4    726     HCG
5    777     HHH
6    807     IAH
----------------------------------------------------------
(b)按照學生對應學號的十位、個位、百位的大小優先順序完成順序輸出:
序號    學號     姓名
1    807     IAH
2    117     BBH
3    222     CCC
4    726     HCG
5    140     BEA
6    777     HHH
----------------------------------------------------------
(c)按照學生對應學號的個位、百位、十位的大小優先順序完成順序輸出:
序號    學號     姓名
1    140     BEA
2    222     CCC
3    726     HCG
4    117     BBH
5    777     HHH
6    807     IAH

相關文章