利用compareTo方法進行字串比較排序
**
利用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
相關文章
- Js比較對Object型別進行排序JSObject型別排序
- 使用錯誤的運算子進行字串比較缺陷漏洞字串
- 字串比較字串
- 利用Pycharm進行程式碼比較更新PyCharm行程
- 字串-簡單字串比較字串
- 比較字串和數字串字串
- PHP比較字串PHP字串
- JAVA字串比較Java字串
- JavaScript與WebAssembly進行比較JavaScriptWeb
- MySQL把字串欄位轉換為日期型別進行比較MySql字串型別
- 比較字串和數字串(續)字串
- 堆排序和快速排序效能比較排序
- 定製排序和比較器排序排序
- Delphi中字串比較大小 VS Oracle-SQL中字串比較大小字串OracleSQL
- Java compareTo() 方法Java
- 在java中進行日期時間比較的4種方法Java
- ***PHP陣列排序+php二維陣列排序方法(PHP比較器)PHP陣列排序
- 幾種排序的比較排序
- python字串比較大小Python字串
- 字串拼接運算比較字串
- JavaScript字串如何比較大小JavaScript字串
- shell 下的字串比較字串
- LintCode 字串比較字串
- 氣泡排序、歸併排序與快速排序比較排序
- oracle中字串的大小比較,字串與數字的比較和運算Oracle字串
- js字串排序方法JS字串排序
- Java™ 教程(比較字串和字串的部分)Java字串
- 陣列進行排序的方法陣列排序
- 排序演算法效能比較排序演算法
- 學習筆記--- 比較排序之堆排序筆記排序
- Java 字串比較、拼接問題Java字串
- Java字串建立方式比較Java字串
- JavaScript 字串連線效能比較JavaScript字串
- 一個字串比較的題字串
- 字串比較的常用函式字串函式
- 字串大小寫轉換和字串的比較字串
- python字串排序方法Python字串排序
- 排序(3)--各類排序演算法的比較排序演算法