1. 程式人生 > >JAVA實驗二:設計一個教師類Teacher(屬於cn.net.sdkd包)實現介面進行排序等

JAVA實驗二:設計一個教師類Teacher(屬於cn.net.sdkd包)實現介面進行排序等

設計一個教師類Teacher(屬於cn.net.sdkd包)

(1)屬性有編號(int no)、姓名(String name)、年齡(int age)、所屬學院(String seminary),為這些屬性設定相應的get和set方法。

(2)為Teacher類重寫equals方法,要求:當兩個教師物件的no相同時返回true。

(3)重寫Teacher類的toString方法,通過該方法可以返回“編號為**、姓名為**、年齡為學院老師”形式的字串。

(4)由多個Teacher物件所形成的陣列可以以兩種方法排序(編號由低到高排序):1)使用Arrays.sort(Object[] a)方法;2)使用Arrays.sort(Object[] a, Comparator c)方法。

(5)再定義一個類TeacherManagement(屬於cn.sd包),提供方法search,方法可以在一組給定的教師中,根據姓名(或年齡)返回等於指定姓名(或年齡)的教師的字串資訊,資訊格式為:“編號為**、姓名為**、年齡為學院老師”。如果沒有滿足條件的教師,則返回“沒有符合條件的教師”。

(6)構造main方法進行測試。


答案:

Teacher類中

package cn.net.sdkd;

import java.util.Arrays;
import java.util.Comparator;

import cn.sd.TeacherManagement;


public class Teacher implements Comparable
{
	private int no;
	private String name;
	private int age;
	private String seminary;
	
	public Teacher(int no,String name,int age,String seminary)
	{
		this.no=no;this.name=name;this.age=age;this.seminary=seminary;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSeminary() {
		return seminary;
	}
	public void setSeminary(String seminary) {
		this.seminary = seminary;
	}
	
	public boolean equals(Object o)
	{
		if(o==null)  return false;
		else
		{
			boolean result=false;
			if(o instanceof Teacher)
			{
				Teacher rec1=(Teacher)o;
				if(this.no.equals(rec1.no))
					result=true;
			}
			return result;
		}
	}
	
	public String toString()
	{
		return "編號為"+no+"、姓名為"+name+"、年齡為"+age+"的"+seminary+"學院老師";
	}
	
	public int compareTo(Object o)
	{
		Teacher t=(Teacher) o;
		if(this.no<t.no) return -1;
		else if(this.no>t.no)  return 1;
		else return 0;
	}
	
	
	public static void main(String[] args)
	{
		Teacher []t=new Teacher[4];
		t[0]=new Teacher(1,"Tom",17,"計科");
		t[1]=new Teacher(1,"Tom1",18,"數媒");
		t[2]=new Teacher(4,"Tom",19,"信安");
		t[3]=new Teacher(3,"Tom2",17,"軟體");
/////////////////////equals判斷
		if(t[0].equals(t[1])) 
		{
			System.out.println("true");
		}
		else 
		{
			System.out.println("false");
		}
		if(t[0].equals(t[2]))
		{
			System.out.println("true");
		}
		else 
		{
			System.out.println("false");
		}
///////////////////////toString判斷
		for(int i=0;i<t.length;i++)
			System.out.println(t[i].toString());
/////////////////////Arrays.sort(Object[] a)判斷
		Arrays.sort(t);
		Arrays.sort(t, new TeacherCompare());
		for(int i=0;i<t.length;i++)
			System.out.println(t[i].toString());
/////////////////////search方法判斷
		TeacherManagement a=new TeacherManagement();
		a.search(t, 17);
		a.search(t, 20);
		a.search(t, "Tom");
	}
}

class TeacherCompare implements Comparator
{
	public int compare(Object o1, Object o2)
	{
		Teacher rec1=(Teacher) o1;
		Teacher rec2=(Teacher) o2;
		if(rec1.getNo()<rec2.getNo()) return -1;
		else if(rec1.getNo()>rec2.getNo()) return 1;
		else return 0;
	}
}

TeacherManagement類中

package cn.sd;

import cn.net.sdkd.Teacher;

public class TeacherManagement 
{
	public void search(Teacher[]t,String name)
	{
		int a=-1;
		for(int i=0;i<t.length;i++)
		{
			if(t[i].getName().equals(name))
			{
				a=i;
				System.out.println(t[a].toString());
			}
		}
		if(a==-1)  System.out.println("沒有符合條件的教師");
	}
	public void search(Teacher[]t,int age)
	{
		int a=-1;
		for(int i=0;i<t.length;i++)
		{
			if(t[i].getAge().equals(age))
			{
				a=i;
				System.out.println(t[a].toString());
			}
		}
		if(a==-1) System.out.println("沒有符合條件的教師");
	}
}

注意:

一、重寫equals方法

(1)返回型別是boolean,名字是equals,形參型別是Object型別

(2)具體實現方法需要記住

public boolean equals(Object o)
	{
		if(o==null)  return false;
		else
		{
			boolean result=false;
			if(o instanceof Teacher)
			{
				Teacher rec1=(Teacher)o;
				if(this.no==rec1.no)
					result=true;
			}
			return result;
		}
	}

(3)使用方法:t[0].equals(t[1]);也就是說,一個變數所指物件的名字.equals(一個變數所指物件的名字);

注意:這裡呼叫的是t[0]所指物件(而非引用)中重寫的equals方法

 		Teacher []t=new Teacher[4];
		t[0]=new Teacher(1,"Tom",17,"計科");
		t[1]=new Teacher(1,"Tom1",18,"數媒");
		t[2]=new Teacher(4,"Tom",19,"信安");
		t[3]=new Teacher(3,"Tom2",17,"軟體");
/////////////////////equals判斷
		if(t[0].equals(t[1])) 
		{
			System.out.println("true");
		}
		else 
		{
			System.out.println("false");
		}
		if(t[0].equals(t[2]))
		{
			System.out.println("true");
		}
		else 
		{
			System.out.println("false");
		}

二、重寫toString方法

(1)返回型別是String型別,名字是toString,沒有形參,直接return一個字串即可

(2)實現形式需要記住

public String toString()
	{
		return "編號為"+no+"、姓名為"+name+"、年齡為"+age+"的"+seminary+"學院老師";
	}

(3)使用方法:t[i].toString();也就是說,一個變數所指物件的名字.toString();

注意:這裡呼叫的是t[i]所指物件(而非引用)中重寫的toString方法

for(int i=0;i<t.length;i++)
			System.out.println(t[i].toString());

三、陣列以某一個變數為依據進行排序

1、使用Arrays.sort(Object[] a)方法(Comparable 定義在類內部,直接在類後面implements就可以,Teacher結構需要變化)

https://blog.csdn.net/winddreams/article/details/51577500?utm_source=blogxgwz4

(1)繼承介面Comparable,也就是implements Comparable

(2)重寫介面中的抽象函式public int compareTo(Object o)

  • 返回值是int型別的

  • 函式名稱是compareTo

  • 形參是Object型別的

  • 先對o進行轉換,然後再返回值

  • 返回型別的探討

  • compare方法返回負數時代表不交換
    compare方法返回0時代表不交換
    compare方法返回正數時代表交換

在函式中,return的有-1、1、0,其中,如果你想讓最終結果按照什麼型別排序的話,就讓誰返回-1,相等返回0,不符合條件的話返回1(比如說想要以no的升序排列(從小到大,前面小,後面大)的話,那就應當寫為if(this.no<t.no) return -1;//前面小,後面大,符合條件,所以返回-1

public class Teacher implements Comparable

public int compareTo(Object o)
	{
		Teacher t=(Teacher) o;
		if(this.no<t.no) return -1;
		else if(this.no>t.no)  return 1;
		else return 0;
	}

(3)使用方法

Arrays.sort(t);
  • Arrays,千萬別忘記s
  • Arrays存在於java.util.Arrays中,所以別忘記先匯入
  • Arrays.sort()中只有陣列引數
  • 如果使用預設排序也就是String型別排序的方式的話,按字母的ASCII編碼大小排序,優先順序A>Z>a>z,有小到大,如果該位置上ASCII碼值相同的話,那麼就比較下一個。
import java.util.Arrays;

Arrays.sort(t);
for(int i=0;i<t.length;i++)
		System.out.println(t[i].toString());

注意:
1、如果實現了compareTo方法,但是不宣告實現Comparable介面的話,是不能使用Array.sort()方法進行排序的。

2、類Student 實現了compareTo方法,但是不宣告實現Comparable介面這個時候,怎樣才能比較呢?

if((Comparable)a[i].compareTo(a[j])>0)
{
	
}

要求:
1、a[i]必須要定義compareTo方法

2、如果Student實現compareTo方法而沒有實現Compare介面,則(Comparable)a[i]會出錯


2、使用Arrays.sort(Object[] a, Comparator c)方法(定義在類外部,Teacher結構不需要任何變化)

(1)並非繼承介面,而是在Teacher類外面,自己再寫一個類,讓這個類implements Comparator

(2)注意 在implements Comparator的時候,要import java.util.Comparator; 因為Comparator在java.util包中

(3)在外面的類中,重寫public int compare(Object o1, Object o2);

  • 返回值是int型別
  • 名字是compare,小寫
  • 形參是Object型別的兩個引用,千萬別忘記
import java.util.Comparator;

class TeacherCompare implements Comparator
{
	public int compare(Object o1, Object o2)
	{
		Teacher rec1=(Teacher) o1;
		Teacher rec2=(Teacher) o2;
		if(rec1.getNo()<rec2.getNo()) return -1;
		else if(rec1.getNo()>rec2.getNo()) return 1;
		else return 0;
	}
}

(4)在內部類中的使用方法Arrays.sort(t, new TeacherCompare());

  • t是陣列
  • TeacherCompare是外部新寫的,implements Comparator
import java.util.Comparator;

public class Teacher
{
Arrays.sort(t, new TeacherCompare());
		for(int i=0;i<t.length;i++)
			System.out.println(t[i].toString());
}

class TeacherCompare implements Comparator
{
	public int compare(Object o1, Object o2)
	{
		Teacher rec1=(Teacher) o1;
		Teacher rec2=(Teacher) o2;
		if(rec1.getNo()<rec2.getNo()) return -1;
		else if(rec1.getNo()>rec2.getNo()) return 1;
		else return 0;
	}
}

Comparator 和 Comparable 的聯絡與區別

https://blog.csdn.net/u012767369/article/details/55002748


四、再定義一個類TeacherManagement(屬於cn.sd包),提供方法search

(1)因為要在類中使用Teacher,所以說,別忘記匯入Teacher類所在的包和宣告自己所屬的包

package cn.sd;

import cn.net.sdkd.Teacher;

(2)因為是在陣列中進行search,所以說,形參是Teacher []t;

(3)在Teachr類中使用TeacherManagement中的search方法的話,需要

  • 先匯入TeacherManagement所在的包import cn.sd.TeacherManagement;
  • 新建一個引用型別並且指向方向為TeacherManagement的物件
  • 利用新建的物件呼叫search方法