Java 關於collection.sort()和compareTo()方法的聯合使用排序問題

已知Main類、Person類的設計,完成Student類,Teacher類、MyTool類的設計。

函數接口定義:

class Student extends Person{ }
class Teacher extends Person{ }
class MyTool{ public static void separateStu_T(List persons,List teachers,List students){} }

Student類繼承了Person,擁有私有屬性int類型的sno和String類型的major,分別代表學號與所學專業;提供對應的set,get方法;比較方法完成按照學號比較。
------------------------------------------------------------------------------------------------
Teacher類繼承了Person,擁有私有屬性int類型的tno和String類型的subject,分別代表教師編號與所授科目;提供對應的set,get方法;比較方法完成按年齡比較。
------------------------------------------------------------------------------------------------
MyTool類中提供方法public static void separateStu_T(List persons,List teachers,List students){},方法 separateStu_T的功能是將persons線性表中的 teacher,student分別放到teachers,students兩個線性表中。
------------------------------------------------------------------------------------------------
裁判測試程序樣例:

import java.util.*;

public class Main {
	public static void main(String[] args) {

     List persons=getPersons();  //得到一個所有人的線性表
		
		List teachers=new ArrayList();
		List students=new ArrayList();
	
		MyTool.separateStu_T( persons,teachers,students); //將persons線性表中的 teacher,student分別放到teachers,students兩個線性表中
		
		Collections.sort(teachers);  //對教師線性表排序
		Collections.sort(students);  //對學生線性表排序
		
		showResult(teachers);  //顯示教師線性表排序以後的結果
		showResult(students);  //顯示學生線性表排序以後的結果
		
	}
	
	public static List getPersons()
	{
		List persons=new ArrayList();
		
		Scanner in=new Scanner(System.in);
		Person person=null;
		
		int num=Integer.parseInt(in.nextLine());
		
		for(int i=0;i<num;i++)
		{	String str=in.nextLine();
			String []data=str.split(",");
			
			if(data[0].equalsIgnoreCase("student"))
			     person=new Student(Integer.parseInt(data[1]),data[2],data[3],Integer.parseInt(data[4]),data[5]);
			else if (data[0].equalsIgnoreCase("teacher"))
				  person=new Teacher(Integer.parseInt(data[1]),data[2],data[3],Integer.parseInt(data[4]),data[5]);
			else person=null;
			     persons.add(person);
		}
		return persons;
	}
	
	public static void showResult(List persons)
	{
		for(int i=0;i<persons.size();i++)
		{
			Person per=(Person)persons.get(i);
			System.out.println(per.getName()+","+per.getGender()+","+per.getAge());
		}
	}
	
	
}	



abstract class Person  implements Comparable
{    private String name;
     private String gender;
     private int age;

	
	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public String getGender() {
		return gender;
	}


	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Person(String name, String gender, int age) {
		super();
		this.name = name;
		this.gender = gender;
		this.age = age;
	}


}
/* 請在這裏寫你的代碼 */

輸入樣例:

輸入的第一行是總人數n,緊跟着輸入n行,每一行代表一個人的信息。下面的例子中n=5,輸入了5個人的信息。

5
student,1001,Tom1,female,18,computer
teacher,2001,Jake1,female,35,datastructer
student,1002,Tom2,male,19,computer
student,1003,Tom3,female,20,software
teacher,2002,Jake2,female,33,database

輸出樣例:

注意:本樣例輸出結果中兩名教師是按照年齡升序排序的,三名學生是按照學號降序排序的。

Jake2,female,33
Jake1,female,35
Tom3,female,20
Tom2,male,19
Tom1,female,18

補充代碼:

class Student extends Person{
private int sno;
private String major;
public void setSno(int sno){
this.sno = sno;
}
public int getSno(){
return sno;
}
public void setMajor(String major){
this.major = major;
}
public String getMajor(){
return major;
}
public Student(int sno,String name,String gender,int age,String major){
super(name,gender,age);
this.sno = sno;



this.major = major;
}
public int compareTo(Object a){
Student o = (Student)a;
return o.sno-this.sno;
}
}
class Teacher extends Person{
		private int tno;
		private String subject;
		Teacher(int tno,String name,String gender,int age,String subject){
			super(name,gender,age);
			this.tno=tno;
			this.subject=subject;
		}
		public int getTno() {
			return tno;
		}
		public void setTno(int tno) {
			this.tno = tno;
		}
		public String getSubject() {
			return subject;
		}
		public void setSubject(String subject) {
			this.subject = subject;
		}
		public int compareTo(Object a){
			Teacher o=(Teacher)a;
			return this.getAge()-o.getAge();
		    }	
	}
	
class MyTool{
public static void separateStu_T(List persons, List teachers, List students){
for(int i = 0;i<persons.size();i++){
if(persons.get(i)instanceof Student){
students.add(persons.get(i));
}
else
teachers.add(persons.get(i));
}
}
}


感受

做這道題用了好幾個小時,其實對代碼中的很多地方都沒有了解過,比如collection.sort是幹啥的、List是什麼都不懂

此題中最重要的知識點就是compareTo()方法的重寫以及它和sort()的結合使用

原本,傳給sort的值如果是1或0,則升序輸出,否則降序輸出

但是在和sort結合使用的時候需要注意

這個compareTo方法是被collection.sort自動調用的(我說怎麼也找不到compareTo的調用方法,漲知識了)

而且你的輸出的內容決定了sort究竟是升序還是降序

舉個例子
(你在含age的Student類裏定義了一個compareTo方法)
降序輸出

public int compareTo(Object a){
Student stu = (Student) a;
return stu.age - this.age; //降序
}

升序輸出

public int compareTo(Object a){
Student stu = (Student) a;
return this.age - stu.age; //升序
}

不難看出,當你使用一個外來對象的屬性減-本對象的屬性時,會是降序

反之,升序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章