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方法