一、实验目标
- 掌握根据实际需求设计Java类的方法;
- 掌握Java中继承的使用方法;
- 掌握Java中package的概念和使用方法;
- 掌握静态方法的定义和使用方法;
- 掌握Object类中equals方法和toString方法的重写方法。
- 掌握Java中抽象类和抽象方法的定义;
- 掌握Java中接口的定义,熟练掌握接口的定义形式以及接口的实现方法。
- 熟练掌握Java中一维数组、多维数组的使用方法,能够使用Java数组解决一般性的应用问题。
二、实验内容
设计一个教师类Teacher(属于cn.net.sdkd包),要求:
- 属性有编号(int no)、姓名(String name)、年龄(int age)、所属学院(String seminary),为这些属性设置相应的get和set方法。
- 为Teacher类重写equals方法,要求:当两个教师对象的no相同时返回true。
- 重写Teacher类的toString方法,通过该方法可以返回“编号为**、姓名为**、年龄为的学院老师”形式的字符串。
- 由多个Teacher对象所形成的数组可以以两种方法排序(编号由低到高排序):1)使用Arrays.sort(Object[] a)方法;2)使用Arrays.sort(Object[] a, Comparator c)方法。
- 再定义一个类TeacherManagement(属于cn.sd包),提供方法search,方法可以在一组给定的教师中,根据姓名(或年龄)返回等于指定姓名(或年龄)的教师的字符串信息,信息格式为:“编号为**、姓名为**、年龄为的学院老师”。如果没有满足条件的教师,则返回“没有符合条件的教师”。
- 构造main方法进行测试。
package cn.net.sdkd;
public class Teacher implements Comparable{
public int no;
public String name;
public int age;
public String seminary;
public void setNo(int no){
this.no=no;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public void setSeminary(String seminary){
this.seminary=seminary;
}
public int getNo(){
return no;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String getSeminary(){
return seminary;
}
public boolean equals(Teacher a,Teacher b){
return a.no==b.no;
}
public String toString(){
return "编号为"+no+"、姓名为"+name+"、年龄为"+age+"的"+seminary+"学院老师";
}
@Override
public int compareTo(Object o) {
Teacher p=(Teacher)o;
return this.no-p.no;
}
}
package cd.sd;
import cn.net.sdkd.Teacher;
import java.util.List;
public class TeacherManagement {
public static void search(String name, List<Teacher> list1){
boolean flag=true;
for(int i=0;i<list1.size();++i){
Teacher tmp=list1.get(i);
if(name.equals(tmp.name)){
System.out.println(tmp.toString());
flag=false;
break;
}
}
if(flag){
System.out.println("没有符合条件的教师");
}
}
public static void search(int age, List<Teacher>list1){
boolean flag=true;
for(int i=0;i<list1.size();++i){
Teacher tmp=list1.get(i);
if(age==tmp.age){
System.out.println(tmp.toString());
flag=false;
break;
}
}
if(flag){
System.out.println("没有符合条件的教师");
}
}
}
package test;
import cd.sd.TeacherManagement;
import cn.net.sdkd.Teacher;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Teacher teacher1 = new Teacher();
teacher1.no=123;
teacher1.name="sss";
teacher1.age=123;
teacher1.seminary="ssss";
Teacher teacher2=new Teacher();
teacher2.no=111;
teacher2.name="sssss";
teacher2.age=111;
teacher2.seminary="aaa";
List<Teacher>list1=new ArrayList<Teacher>();
list1.add(teacher1);
list1.add(teacher2);
Collections.sort(list1);
System.out.println(list1);
TeacherManagement.search(121,list1);
sc.close();
}
}
- 设计一个带表头的双向链表(链表中数据的具体类型可以随意),提供以下方法:(1)insert:在某个位置插入对象;(2)insert:在链表的最后插入对象;(2)delete:在某个位置删除对象;(3)delete:删除链表中与x相同的元素;(4)size:返回当前链表中对象的个数;(5)isEmpty:判断链表是否为空;(6)traverse:遍历链表,打印出所有的元素;(7)getData:取得某个位置的对象。构造main函数进行测试。
关于插入与删除的细节参考这篇博客
package test;
import java.util.Scanner;
class MyList {
class Node {
int data;
Node front;
Node next;
public Node() {
data = 0;
front = null;
next = null;
}
public Node(int data, Node front, Node next) {
this.data = data;
this.front = front;
this.next = next;
}
}
public int size;
public Node head;
public Node cur;
public MyList(){
this.size=0;
head=new Node();
cur=new Node(0,head,null);
head.next=cur;
}
public void insert(int x){
Node tmp=new Node(x,null,null);
tmp.front=cur.front;
cur.front.next=tmp;
tmp.next=cur;
cur.front=tmp;
size++;
}
public void delete(int index){
Node tmp=head;
tmp=tmp.next;
int cnt=1;
while(cnt<index){
tmp=tmp.next;
cnt++;
}
tmp.front.next=tmp.next;
tmp.next.front=tmp.front;
size--;
}
public void deleteall(int x){
Node tmp=head.next;
//int num=size;
while(true){
Node tmp2=tmp.next;
if(tmp.data==x){
tmp.front.next=tmp.next;
tmp.next.front=tmp.front;
size--;
}
tmp=tmp2;
if(tmp2==null)break;
}
}
public int getData(int index){
Node tmp=head;
tmp=tmp.next;
int cnt=1;
while(cnt<index){
tmp=tmp.next;
cnt++;
}
return tmp.data;
}
public boolean isEmpty(){
if(size>0)return true;
else return false;
}
public void treverse(){
Node tmp=head.next;
while(tmp.next!=null){
System.out.println(tmp.data);
tmp=tmp.next;
}
}
}
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MyList list1 = new MyList();
for(int i=1;i<=3;++i){
list1.insert(i);
}
//list1.delete(2);
//System.out.println(list1.size);
list1.insert(1);
list1.deleteall(1);
System.out.println(list1.isEmpty());
list1.treverse();
/* for(int i=1;i<=2;++i){
System.out.println(list1.getData(i));
}*/
sc.close();
}
}
- 使用一维数组编码实现一个栈(Stack)类,要求提供以下操作:(1)boolean isEmpty():判断栈当前是否为空;(2)入栈操作void push(obj):把数据元素obj插入堆栈;(3)出栈操作Object pop():出栈,并返回删除的数据元素;(4)Object getTop():取堆栈当前栈顶的数据元素并返回;(5)利用Stack类实现一个方法:输入一个正整数,输出该整数所对应的二进制数。
package test;
import java.util.Scanner;
class Stack{
private int top;
private int size;
private Object []a;
int n=2;
public Stack(){
top=-1;
size=10;
a=new Object[size];
}
public boolean isEmpty(){
return top==-1;
}
public void push(Object x){
if(top==size-1){
Object []newa = new Object[a.length*n];
System.arraycopy(a,0,newa,0,a.length);
a=newa;
}
a[++top]=x;
}
public Object pop(){
Object o=a[top];
a[top--]=null;
return o;
}
public Object getTop(){
return a[top];
}
}
public class Main{
static void getbite(int x){
Stack s = new Stack();
while(true){
if(x<1)break;
s.push(x%2);
x/=2;
}
while(!s.isEmpty()){
System.out.print(s.pop());
}
System.out.println();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack aa = new Stack();
aa.push(1);
aa.push(2);
System.out.println(aa.getTop());
getbite(2);
System.out.println(aa.pop());
sc.close();
}
}
- 利用二维数组(double[])实现一个矩阵类:Matrix。要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为value;(2)get(int row,int col):取第row行第col列的元素;(3)width():返回矩阵的列数;(4)height():返回矩阵的行数;(5)Matrix add(Matrix b):返回当前矩阵与矩阵b相加后的矩阵;(6)Matrix multiply(Matrix b):返回当前矩阵与矩阵b相乘后的矩阵。(7)Matrix transpose():返回当前矩阵的转置矩阵;(8)getMax():返回矩阵中的最大值及其所在行和列;(9)print():以行和列的形式打印出当前矩阵。
package test;
public class Matrix {
private double [][]a;
private int row,col;
public Matrix(int row, int col) {
this.row = row;
this.col = col;
a=new double[row][col];
}
public void set(int i,int j,double val){
a[i][j]=val;
}
public double get(int i,int j){
return a[i][j];
}
public int width(){
return col;
}
public int height(){
return row;
}
public Matrix add(Matrix b){
Matrix matrix = new Matrix(row,col);
for(int i=0;i<row;++i){
for(int j=0;j<col;++j){
matrix.a[i][j]=this.a[i][j]+b.a[i][j];
}
}
return matrix;
}
public Matrix multiply(Matrix b){
Matrix matrix = new Matrix(row, col);
for(int i=0;i<row;++i){
for(int j=0;j<col;++j){
double sum=0;
for(int i1=0;i1<row;++i1){
for(int j1=0;j1<col;++j1){
sum=sum+this.a[i1][j1]*b.a[j1][i1];
}
}
matrix.a[i][j]=sum;
}
}
return matrix;
}
public Matrix transpose(Matrix b){
Matrix matrix= new Matrix(b.col, b.row);
for(int i=0;i<b.row;++i){
for(int j=0;j<b.col;++j){
matrix.a[j][i]=b.a[i][j];
}
}
return matrix;
}
public void getMax(){
int r=0,c=0;
double maxx=this.a[0][0];
for(int i=0;i<row;++i)
for(int j=0;j<col;++j){
if(this.a[i][j]>maxx){
r=i;c=j;maxx=a[i][j];
}
}
System.out.println(r+" "+c+" "+maxx);
}
public void print(){
for(int i=0;i<row;++i){
for(int j=0;j<col;++j)
System.out.print(a[i][j]+" ");
System.out.println();
}
}
}
package test;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Matrix matrix = new Matrix(3, 2);
for(int i=0;i<3;++i)
for(int j=0;j<2;++j)
matrix.set(i,j,i+j);
matrix.print();
matrix.transpose(matrix).print();
Matrix matrix1 = new Matrix(3, 2);
for(int i=0;i<3;++i)
for(int j=0;j<2;++j)
matrix1.set(i,j,i+j);
matrix.add(matrix1).print();
matrix.multiply(matrix1.transpose(matrix1)).print();
matrix.getMax();
sc.close();
}
}