实验目的:掌握接口的定义与实现;熟悉内部类机制;能够使用Comparable、Comparator接口;会使用简单的Lambda表达式。
- Shape与Comparable接口
改写实验4中的抽象类Shape,让其实现Comparable接口,实现对面积的排序;在测试类中创建Shape类型的数组或动态数组,里面有若干个Circle、Rectangle和Triangle对象,然后利用Arrays.sort或Collections.sort对该Shape数组或动态数组进行排序;输出排序后Shapes数组。 - Staff与Comparator接口
-
- 针对实验4编写的Staff类,分别编写NameComparator,AgeComparator和ComplexComparator比较器。其中ComplexComparator为复合比较器,至少选用两个关键字来排序,关键字选择、次序及升降序均由同学们自行设计。
-
- 编写一个测试类,在测试类中添加若干个Staff, Teacher, SecurityGuard, Dean实例(个数及内容自定),并在测试类中定义并测试如下方法:
①编写一个方法private static void printName(Staff[] staffs)打印出每个人的名字; ②编写一个方法private static void printSalary(Staff[] staffs)打印出Staff类或者其子类对象的薪水(注意:Staff的薪水只有salary,Teacher的薪水为salary+postAllowance,SecurityGuard的薪水为salary+dangerousAllowance,而Dean的薪水则为salary+postAllowance+adminAward); ③编写一方法private static void sortBySalary(Staff[] staffs),支持对Staff类及其子类按照各自的薪水降序排序; ④编写一方法private static void sortByAge(Staff[] staffs),对Staff对象按照年龄升序排序,再编写一个方法按name升序进行排序;⑤编写一方法sortByDateHired,支持对Staff类及其子类按照各自的dateHired升序排序,可以使用java.util.Date或java.time.LocalDateTime类型的compareTo方法。
-
- Lambda表达式
使用Lambda表达式简化上述“Staff与Comparator接口”题目中的NameComparator,AgeComparator和ComplexComparator比较器。测试方法与上述相同。
实验报告
一、目的
掌握接口的定义与实现;熟悉内部类机制;能够使用Comparable、Comparator接口;会使用简单的Lambda表达式。
二、实验内容与设计思想
1.设计思路
-
Shape与Comparable接口
-
Staff与Comparator接口
-
Lambda表达式
主要数据结构
问题1 |
| 形状类: 存放PI求周长和求面积的方法 |
| 长方形类: 存放长方形的长和宽 | |
| 圆类: 存放圆的半径 | |
| 三角形类: 存放三角形的三条边的周长 | |
问题二 |
| 职工类: 存放职工的姓名,地址,性别,年龄,工资,入职日期信息。 |
| 教师类: 存放教师除了职工信息外的系,专业,岗位津贴信息。 | |
| 保安类: 存放保安除了职工信息外的专技和高危津贴信息。 | |
| 院长类: 存放院长除了教师信息外的行政补贴 | |
问题三 |
| 职工类: 存放职工的姓名,地址,性别,年龄,工资,入职日期信息。 |
| 教师类: 存放教师除了职工信息外的系,专业,岗位津贴信息。 | |
| 保安类: 存放保安除了职工信息外的专技和高危津贴信息。 | |
| 院长类: 存放院长除了教师信息外的行政补贴 |
主要代码结构
三、实验使用环境
软件:java version “18.0.2”
EclipseIDE 2022-06
平台:win10
四、实验步骤和调试过程
exp1:Shape与Comparable接口
需求
改写实验4中的抽象类Shape,让其实现Comparable接口,实现对面积的排序;
在测试类中创建Shape类型的数组或动态数组,里面有若干个Circle、Rectangle和Triangle对象,然后利用Arrays.sort或Collections.sort对该Shape数组或动态数组进行排序;输出排序后Shapes数组。
实验步骤
Shape类
package exp1;
import java.util.Arrays;
import java.util.Comparator;
abstract public class Shape implements Comparable{
public final static double PI = 3.1415926;
public abstract double getPerimeter();
public abstract double getArea();
public int compareTo(Shape o)
{
return Double.compare(this.getArea(), o.getArea());
}
}
测试类
package exp1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import static java.lang.Math.random;
public class Test
{
public static void main(String[] args)
{
System.out.println("测试内容:2个三角形,2个圆形,2个长方形的面积排序");
Shape[] shapes = new Shape[6];
shapes[0] = new Rectangle(random() * 100, random() * 100);
shapes[1] = new Rectangle(random() * 100, random() * 100);
shapes[2] = new Triangle(random() * 100, random() * 100, random() * 100);
shapes[3] = new Triangle(random() * 100, random() * 100, random() * 100);
shapes[4] = new Circle(random() * 100);
shapes[5] = new Circle(random() * 100);
System.out.println("测试面积排序-------------------------------------------- ");
Arrays.sort(shapes);
for (Shape i : shapes)
System.out.println(i.getArea());
}
}
Circle类(与实验四同,无修改)
package exp1;
import java.util.Objects;
import static java.lang.Math.random;
public class Circle extends Shape
{
private double r;
public Circle()
{
r = random();
}
public Circle(double r)
{
this.r = r;
}
public double getPerimeter()
{
return 2 * Math.PI * r;
}
public double getArea()
{
return Math.PI * r * r;
}
public double getR()
{
return r;
}
public void setR(double r)
{
this.r = r;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Circle circle = (Circle) o;
return Double.compare(circle.r, r) == 0;
}
@Override
public int hashCode()
{
return Objects.hash(r);
}
@Override
public String toString()
{
return "Circle{" +
"r=" + r +
'}';
}
}
Triangle类(与实验四同,无修改)
package exp1;
import java.util.Arrays;
import java.util.Objects;
import static java.lang.Math.random;
import static java.lang.Math.sqrt;
public class Triangle extends Shape
{
private double a, b, c;
public Triangle()
{
a = random();
b = random();
c = random();
}
public Triangle(double a, double b, double c)
{
this.a = a;
this.b = b;
this.c = c;
}
public double getPerimeter()
{
return a + b + c;
}
public double getArea()
{
double p = (a + b + c) / 2;
double[] length = {a, b, c};
Arrays.sort(length);
if (length[0] + length[1] <= length[2])
return 0;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
public double getA()
{
return a;
}
public double getB()
{
return b;
}
public double getC()
{
return c;
}
public void setA(double a)
{
this.a = a;
}
public void setB(double b)
{
this.b = b;
}
public void setC(double c)
{
this.c = c;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Triangle triangle = (Triangle) o;
return Double.compare(triangle.a, a) == 0 && Double.compare(triangle.b, b) == 0 && Double.compare(triangle.c, c) == 0;
}
@Override
public int hashCode()
{
return Objects.hash(a, b, c);
}
@Override
public String toString()
{
return "Triangle{" +
"a=" + a +
", b=" + b +
", c=" + c +
'}';
}
}
Rectangle类(与实验四同,无修改)
package exp1;
import java.util.Objects;
import static java.lang.Math.random;
public class Rectangle extends Shape
{
private double width, height;
public Rectangle()
{
width = random();
height = random();
}
public Rectangle(double a, double b)
{
width = a;
height = b;
}
public double getPerimeter()
{
return 2 * (width + height);
}
public double getArea()
{
return width * height;
}
public double getWidth()
{
return width;
}
public double getHeight()
{
return height;
}
public void setWidth(double width)
{
this.width = width;
}
public void setHeight(double height)
{
this.height = height;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Rectangle rectangle = (Rectangle) o;
return Double.compare(rectangle.width, width) == 0 && Double.compare(rectangle.height, height) == 0;
}
@Override
public int hashCode()
{
return Objects.hash(width, height);
}
@Override
public String toString()
{
return "Rectangle{" +
"width=" + width +
", height=" + height +
'}';
}
}
测试数据设计
2个三角形,2个长方形,2个圆形
测试内容:2个三角形,2个圆形,2个长方形的面积排序
测试面积排序--------------------------------------------
13.29407932008806
355.9673605592515
1408.771828943242
2766.254050847555
4067.2443482681883
13242.47508864874
exp2:Staff与Comparator接口
需求
-
针对实验4编写的Staff类,分别编写NameComparator,AgeComparator和ComplexComparator比较器。其中ComplexComparator为复合比较器,至少选用两个关键字来排序,关键字选择、次序及升降序均由同学们自行设计。
-
编写一个测试类,在测试类中添加若干个Staff, Teacher, SecurityGuard,
Dean实例(个数及内容自定),并在测试类中定义并测试如下方法:
①编写一个方法private static void printName(Staff[] staffs)打印出每个人的名字;
②编写一个方法private static void printSalary(Staff[] staffs)打印出Staff类或者其子类对象的薪水
③编写一方法private static void sortBySalary(Staff[] staffs),支持对Staff类及其子类按照各自的薪水降序排序;
④编写一方法private static void sortByAge(Staff[] staffs),对Staff对象按照年龄升序排序,再编写一个方法按name升序进行排序;
⑤编写一方法sortByDateHired,支持对Staff类及其子类按照各自的dateHired升序排序,可以使用java.util.Date或java.time.LocalDateTime类型的compareTo方法。
实验步骤
package exp2;
import javax.security.auth.callback.NameCallback;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Comparator;
public class Staff
{
protected String name, address, sex;
protected int age;
protected double salary;
protected LocalDate dataHired;
public Staff(String name, String address, String sex, int age, double salary, LocalDate dataHired)
{
this.name = name;
this.address = address;
this.sex = sex;
this.age = age;
this.salary = salary;
this.dataHired = dataHired;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public double getSalary()
{
return salary;
}
public void setSalary(double salary)
{
this.salary = salary;
}
public LocalDate getDataHired()
{
return dataHired;
}
public void setDataHired(LocalDate dataHired)
{
this.dataHired = dataHired;
}
public double getSumSalary()
{
return salary;
}
@Override
public String toString()
{
return "Staff{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", salary=" + getSumSalary() +
", dataHired=" + dataHired +
'}';
}
}
Test类
package exp2;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import static java.lang.Math.random;
public class Test
{
static private int personNum = 4 * 3;
private static int id;
static String[] departments;
static HashMap<String, String[]> specialists;
static String[] skills;
static void init()
{
id = 0;
departments = new String[]{"中文系", "美术系", "音乐系", "计算机系"};
specialists = new HashMap<>();
specialists.put("中文系", new String[]{"汉语言文学", "汉语言", "秘书学"});
specialists.put("美术系", new String[]{"美术教育", "书法", "雕塑", "美术"});
specialists.put("音乐系", new String[]{"作曲系", "声乐系", "民声系", "钢琴系", "电子琴系"});
specialists.put("计算机系", new String[]{"软件工程", "网络工程", "计算机与科学", "智能科学与技术"});
skills = new String[]{"抓小偷", "使用防暴叉", "看门", "查看健康码", "巡逻校园", "保卫校园"};
}
static String getName()
{
return "张三" + (++id);
}
static String getAddress()
{
return "翻斗大街翻斗花园二号楼10" + id;
}
static String getSex()
{
return random() <= 0.5 ? "男" : "女";
}
static int getAge()
{
return (int) (random() * 100);
}
static double getSalary()
{
return random() * 10000;
}
static LocalDate getData()
{
int year = 2000 + (int) (random() * 22);
int month = 1 + (int) (random() * 11);
int day = 1 + (int) (random() * 27);
return LocalDate.of(year, month, day);
}
static double getPostAllowance()
{
return random() * 1000;
}
static String getDepartment()
{
return departments[(int) (random() * departments.length)];
}
static String getSpeciality(String department)
{
String[] speciality = specialists.get(department);
return speciality[(int) (random() * speciality.length)];
}
static String getSkill()
{
return skills[(int) (random() * skills.length)];
}
static double getDangerousAllowance()
{
return random() * 1000;
}
static double getAdminAward()
{
return random() * 1000;
}
public static void main(String[] args)
{
init();
Staff[] staffs = new Staff[personNum];
for (int i = 0; i < personNum; i += 4)
{
Staff staff = new Staff(getName(), getAddress(), getSex(), getAge(), getSalary(), getData());
String department = getDepartment();
Teacher teacher = new Teacher(getName(), getAddress(), getSex(), getAge(), getSalary(), getData(), department, getSpeciality(department), getPostAllowance());
SecurityGuard securityGuard = new SecurityGuard(getName(), getAddress(), getSex(), getAge(), getSalary(), getData(), getSkill(), getDangerousAllowance());
Dean dean = new Dean(getName(), getAddress(), getSex(), getAge(), getSalary(), getData(), department, getSpeciality(department), getPostAllowance(), getAdminAward());
staffs[i] = staff;
staffs[i + 1] = teacher;
staffs[i + 2] = securityGuard;
staffs[i + 3] = dean;
}
System.out.println("打印名字-------------------------------------------- ");
printName(staffs);
System.out.println("打印薪水-------------------------------------------- ");
printSalary(staffs);
System.out.println("按照工资降序排序-------------------------------------------- ");
sortBySalary(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getSalary());
System.out.println("按照年龄升序排序-------------------------------------------- ");
sortByAge(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getAge());
System.out.println("按照名字升序排序-------------------------------------------- ");
sortByName(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getName());
System.out.println("按照日期升序排序-------------------------------------------- ");
sortByDateHired(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getDataHired());
}
public static void printName(Staff[] persons)
{
for (Staff staff : persons)
System.out.println(staff.getName());
}
public static void printSalary(Staff[] staffs)
{
for (Staff staff : staffs)
System.out.println(staff.getSumSalary());
}
//薪水降序
public static void sortBySalary(Staff[] staffs)
{
Arrays.sort(staffs, new Comparator<Staff>()
{
@Override
public int compare(Staff o1, Staff o2)
{
return Double.compare(o2.getSumSalary(),o1.getSumSalary());
}
});
}
public static void sortByAge(Staff[] staffs)
{
Arrays.sort(staffs, new Comparator<Staff>()
{
@Override
public int compare(Staff o1, Staff o2)
{
return o1.getAge()-o2.getAge();
}
});
}
public static void sortByName(Staff[] staffs)
{
Arrays.sort(staffs, new Comparator<Staff>()
{
@Override
public int compare(Staff o1, Staff o2)
{
return o1.getName().compareTo(o2.getName());
}
});
}
public static void sortByDateHired(Staff[] staffs)
{
Arrays.sort(staffs, new Comparator<Staff>()
{
@Override
public int compare(Staff o1, Staff o2)
{
return o1.getDataHired().compareTo(o2.getDataHired());
}
});
}
public static void print(Staff[] staffs)
{
for (Staff staff : staffs)
System.out.println(staff.toString());
System.out.println("\n\n");
}
}
Dean类(与实验四同,无修改)
package exp2;
import java.time.LocalDate;
public class Dean extends Teacher
{
private double adminAward;
public Dean(String name, String address, String sex, int age, double salary, LocalDate dataHired, String department, String speciality, double postAllowance, double adminAward)
{
super(name, address, sex, age, salary, dataHired, department, speciality, postAllowance);
this.adminAward = adminAward;
}
public double getAdminAward()
{
return adminAward;
}
public void setAdminAward(double adminAward)
{
this.adminAward = adminAward;
}
public double getSumSalary(){return super.getSumSalary()+adminAward;}
@Override
public String toString()
{
return "Dean{" +
"adminAward=" + adminAward +
", name='" + name + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", salary=" + getSumSalary() +
", dataHired=" + dataHired +
'}';
}
}
SecurityGuard 类(与实验四同,无修改)
package exp2;
import java.time.LocalDate;
public class SecurityGuard extends Staff
{
private String skills;
private double dangerousAllowance;
public SecurityGuard(String name, String address, String sex, int age, double salary, LocalDate dataHired, String skills, double dangerousAllowance)
{
super(name, address, sex, age, salary, dataHired);
this.skills = skills;
this.dangerousAllowance = dangerousAllowance;
}
public String getSkills()
{
return skills;
}
public void setSkills(String skills)
{
this.skills = skills;
}
public double getDangerousAllowance()
{
return dangerousAllowance;
}
public void setDangerousAllowance(double dangerousAllowance)
{
this.dangerousAllowance = dangerousAllowance;
}
public double getSumSalary(){return super.getSumSalary()+getDangerousAllowance();}
@Override
public String toString()
{
return "SecurityGuard{" +
"skills='" + skills + '\'' +
", dangerousAllowance=" + dangerousAllowance +
", name='" + name + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", salary=" + getSumSalary() +
", dataHired=" + dataHired +
'}';
}
}
Teacher 类(与实验四同,无修改)
package exp2;
import java.time.LocalDate;
public class Teacher extends Staff
{
private String department;
private String speciality;
protected double postAllowance;
public Teacher(String name, String address, String sex, int age, double salary, LocalDate dataHired, String department, String speciality, double postAllowance)
{
super(name, address, sex, age, salary, dataHired);
this.department = department;
this.speciality = speciality;
this.postAllowance = postAllowance;
}
public String getDepartment()
{
return department;
}
public void setDepartment(String department)
{
this.department = department;
}
public String getSpeciality()
{
return speciality;
}
public void setSpeciality(String speciality)
{
this.speciality = speciality;
}
public double getPostAllowance()
{
return postAllowance;
}
public void setPostAllowance(double postAllowance)
{
this.postAllowance = postAllowance;
}
public double getSumSalary(){return super.getSumSalary()+postAllowance;}
@Override
public String toString()
{
return "Teacher{" +
"department='" + department + '\'' +
", speciality='" + speciality + '\'' +
", postAllowance=" + postAllowance +
", name='" + name + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", salary=" + getSumSalary() +
", dataHired=" + dataHired +
'}';
}
}
测试数据设计
3个职工,3个老师,3个保安,3个院长
测试结果分析
打印名字--------------------------------------------
张三1
张三2
张三3
张三4
张三5
张三6
张三7
张三8
张三9
张三10
张三11
张三12
打印薪水--------------------------------------------
5865.013286479973
5645.101089689207
4131.130394177577
1366.5247904880703
4467.609144333133
4949.127485104683
2784.756380796071
4422.828379359303
8739.216839198101
9107.852933826107
10210.518851524717
5863.136518032674
工资降序
(仅打印工资)
9413.417909244647
7469.1136435471835
6904.001140059544
6185.161279714392
4648.70052154496
4261.355205662827
4555.329912932398
3814.4327301334124
2870.7409052259823
2542.4122056635547
2537.4464930176123
2261.7745885328777
按照工资降序排序
(打印所有信息)
SecurityGuard{skills='查看健康码', dangerousAllowance=255.19945357671492, name='张三11', address='翻斗大街翻斗花园二号楼1011', sex='女', age=24, salary=10210.518851524717, dataHired=2010-06-02}
Teacher{department='音乐系', speciality='钢琴系', postAllowance=963.2910329132834, name='张三10', address='翻斗大街翻斗花园二号楼1010', sex='男', age=36, salary=9107.852933826107, dataHired=2004-02-25}
Staff{name='张三9', address='翻斗大街翻斗花园二号楼109', sex='男', age=48, salary=8739.216839198101, dataHired=2006-01-15}
Staff{name='张三1', address='翻斗大街翻斗花园二号楼101', sex='女', age=1, salary=5865.013286479973, dataHired=2009-01-24}
Dean{adminAward=950.1295659399076, name='张三12', address='翻斗大街翻斗花园二号楼1012', sex='男', age=64, salary=5863.136518032674, dataHired=2004-09-02}
Teacher{department='音乐系', speciality='电子琴系', postAllowance=435.8243423482432, name='张三2', address='翻斗大街翻斗花园二号楼102', sex='男', age=96, salary=5645.101089689207, dataHired=2017-09-17}
Teacher{department='音乐系', speciality='作曲系', postAllowance=277.6722989042707, name='张三6', address='翻斗大街翻斗花园二号楼106', sex='男', age=28, salary=4949.127485104683, dataHired=2001-05-19}
Staff{name='张三5', address='翻斗大街翻斗花园二号楼105', sex='女', age=73, salary=4467.609144333133, dataHired=2007-06-01}
Dean{adminAward=733.5199557969281, name='张三8', address='翻斗大街翻斗花园二号楼108', sex='女', age=55, salary=4422.828379359303, dataHired=2012-07-13}
SecurityGuard{skills='巡逻校园', dangerousAllowance=200.47650075084667, name='张三3', address='翻斗大街翻斗花园二号楼103', sex='男', age=81, salary=4131.130394177577, dataHired=2006-07-20}
SecurityGuard{skills='保卫校园', dangerousAllowance=778.1411392841513, name='张三7', address='翻斗大街翻斗花园二号楼107', sex='男', age=31, salary=2784.756380796071, dataHired=2018-07-09}
Dean{adminAward=932.3427637998242, name='张三4', address='翻斗大街翻斗花园二号楼104', sex='女', age=85, salary=1366.5247904880703, dataHired=2014-11-01}
年龄升序
(仅打印年龄)
5
8
26
33
35
35
49
50
61
92
97
98
按照年龄升序排序(打印所有信息)--------------------------------------------
Staff{name='张三1', address='翻斗大街翻斗花园二号楼101', sex='女', age=1, salary=5865.013286479973, dataHired=2009-01-24}
SecurityGuard{skills='查看健康码', dangerousAllowance=255.19945357671492, name='张三11', address='翻斗大街翻斗花园二号楼1011', sex='女', age=24, salary=10210.518851524717, dataHired=2010-06-02}
Teacher{department='音乐系', speciality='作曲系', postAllowance=277.6722989042707, name='张三6', address='翻斗大街翻斗花园二号楼106', sex='男', age=28, salary=4949.127485104683, dataHired=2001-05-19}
SecurityGuard{skills='保卫校园', dangerousAllowance=778.1411392841513, name='张三7', address='翻斗大街翻斗花园二号楼107', sex='男', age=31, salary=2784.756380796071, dataHired=2018-07-09}
Teacher{department='音乐系', speciality='钢琴系', postAllowance=963.2910329132834, name='张三10', address='翻斗大街翻斗花园二号楼1010', sex='男', age=36, salary=9107.852933826107, dataHired=2004-02-25}
Staff{name='张三9', address='翻斗大街翻斗花园二号楼109', sex='男', age=48, salary=8739.216839198101, dataHired=2006-01-15}
Dean{adminAward=733.5199557969281, name='张三8', address='翻斗大街翻斗花园二号楼108', sex='女', age=55, salary=4422.828379359303, dataHired=2012-07-13}
Dean{adminAward=950.1295659399076, name='张三12', address='翻斗大街翻斗花园二号楼1012', sex='男', age=64, salary=5863.136518032674, dataHired=2004-09-02}
Staff{name='张三5', address='翻斗大街翻斗花园二号楼105', sex='女', age=73, salary=4467.609144333133, dataHired=2007-06-01}
SecurityGuard{skills='巡逻校园', dangerousAllowance=200.47650075084667, name='张三3', address='翻斗大街翻斗花园二号楼103', sex='男', age=81, salary=4131.130394177577, dataHired=2006-07-20}
Dean{adminAward=932.3427637998242, name='张三4', address='翻斗大街翻斗花园二号楼104', sex='女', age=85, salary=1366.5247904880703, dataHired=2014-11-01}
Teacher{department='音乐系', speciality='电子琴系', postAllowance=435.8243423482432, name='张三2', address='翻斗大街翻斗花园二号楼102', sex='男', age=96, salary=5645.101089689207, dataHired=2017-09-17}
名字升序
(仅打印名字)
张三1
张三10
张三11
张三12
张三2
张三3
张三4
张三5
张三6
张三7
张三8
张三9
按照名字升序排序(打印所有信息)--------------------------------------------
Staff{name='张三1', address='翻斗大街翻斗花园二号楼101', sex='女', age=1, salary=5865.013286479973, dataHired=2009-01-24}
Teacher{department='音乐系', speciality='钢琴系', postAllowance=963.2910329132834, name='张三10', address='翻斗大街翻斗花园二号楼1010', sex='男', age=36, salary=9107.852933826107, dataHired=2004-02-25}
SecurityGuard{skills='查看健康码', dangerousAllowance=255.19945357671492, name='张三11', address='翻斗大街翻斗花园二号楼1011', sex='女', age=24, salary=10210.518851524717, dataHired=2010-06-02}
Dean{adminAward=950.1295659399076, name='张三12', address='翻斗大街翻斗花园二号楼1012', sex='男', age=64, salary=5863.136518032674, dataHired=2004-09-02}
Teacher{department='音乐系', speciality='电子琴系', postAllowance=435.8243423482432, name='张三2', address='翻斗大街翻斗花园二号楼102', sex='男', age=96, salary=5645.101089689207, dataHired=2017-09-17}
SecurityGuard{skills='巡逻校园', dangerousAllowance=200.47650075084667, name='张三3', address='翻斗大街翻斗花园二号楼103', sex='男', age=81, salary=4131.130394177577, dataHired=2006-07-20}
Dean{adminAward=932.3427637998242, name='张三4', address='翻斗大街翻斗花园二号楼104', sex='女', age=85, salary=1366.5247904880703, dataHired=2014-11-01}
Staff{name='张三5', address='翻斗大街翻斗花园二号楼105', sex='女', age=73, salary=4467.609144333133, dataHired=2007-06-01}
Teacher{department='音乐系', speciality='作曲系', postAllowance=277.6722989042707, name='张三6', address='翻斗大街翻斗花园二号楼106', sex='男', age=28, salary=4949.127485104683, dataHired=2001-05-19}
SecurityGuard{skills='保卫校园', dangerousAllowance=778.1411392841513, name='张三7', address='翻斗大街翻斗花园二号楼107', sex='男', age=31, salary=2784.756380796071, dataHired=2018-07-09}
Dean{adminAward=733.5199557969281, name='张三8', address='翻斗大街翻斗花园二号楼108', sex='女', age=55, salary=4422.828379359303, dataHired=2012-07-13}
Staff{name='张三9', address='翻斗大街翻斗花园二号楼109', sex='男', age=48, salary=8739.216839198101, dataHired=2006-01-15}
日期升序
(仅打印日期)
2003-05-21
2004-11-26
2006-08-19
2009-07-04
2009-09-07
2010-09-23
2014-10-08
2015-02-24
2017-06-18
2017-10-08
2020-03-13
2020-10-03
按照日期升序排序
(打印所有日期)--------------------------------------------
Teacher{department='音乐系', speciality='作曲系', postAllowance=277.6722989042707, name='张三6', address='翻斗大街翻斗花园二号楼106', sex='男', age=28, salary=4949.127485104683, dataHired=2001-05-19}
Teacher{department='音乐系', speciality='钢琴系', postAllowance=963.2910329132834, name='张三10', address='翻斗大街翻斗花园二号楼1010', sex='男', age=36, salary=9107.852933826107, dataHired=2004-02-25}
Dean{adminAward=950.1295659399076, name='张三12', address='翻斗大街翻斗花园二号楼1012', sex='男', age=64, salary=5863.136518032674, dataHired=2004-09-02}
Staff{name='张三9', address='翻斗大街翻斗花园二号楼109', sex='男', age=48, salary=8739.216839198101, dataHired=2006-01-15}
SecurityGuard{skills='巡逻校园', dangerousAllowance=200.47650075084667, name='张三3', address='翻斗大街翻斗花园二号楼103', sex='男', age=81, salary=4131.130394177577, dataHired=2006-07-20}
Staff{name='张三5', address='翻斗大街翻斗花园二号楼105', sex='女', age=73, salary=4467.609144333133, dataHired=2007-06-01}
Staff{name='张三1', address='翻斗大街翻斗花园二号楼101', sex='女', age=1, salary=5865.013286479973, dataHired=2009-01-24}
SecurityGuard{skills='查看健康码', dangerousAllowance=255.19945357671492, name='张三11', address='翻斗大街翻斗花园二号楼1011', sex='女', age=24, salary=10210.518851524717, dataHired=2010-06-02}
Dean{adminAward=733.5199557969281, name='张三8', address='翻斗大街翻斗花园二号楼108', sex='女', age=55, salary=4422.828379359303, dataHired=2012-07-13}
Dean{adminAward=932.3427637998242, name='张三4', address='翻斗大街翻斗花园二号楼104', sex='女', age=85, salary=1366.5247904880703, dataHired=2014-11-01}
Teacher{department='音乐系', speciality='电子琴系', postAllowance=435.8243423482432, name='张三2', address='翻斗大街翻斗花园二号楼102', sex='男', age=96, salary=5645.101089689207, dataHired=2017-09-17}
SecurityGuard{skills='保卫校园', dangerousAllowance=778.1411392841513, name='张三7', address='翻斗大街翻斗花园二号楼107', sex='男', age=31, salary=2784.756380796071, dataHired=2018-07-09}
exp3:Lambda表达式
需求
使用Lambda表达式简化上述"Staff与Comparator接口"题目中的NameComparator,AgeComparator和ComplexComparator比较器。测试方法与上述相同。
实验步骤
Shape类
按照日期升序排序
(打印所有日期)--------------------------------------------
Teacher{department='音乐系', speciality='作曲系', postAllowance=277.6722989042707, name='张三6', address='翻斗大街翻斗花园二号楼106', sex='男', age=28, salary=4949.127485104683, dataHired=2001-05-19}
Teacher{department='音乐系', speciality='钢琴系', postAllowance=963.2910329132834, name='张三10', address='翻斗大街翻斗花园二号楼1010', sex='男', age=36, salary=9107.852933826107, dataHired=2004-02-25}
Dean{adminAward=950.1295659399076, name='张三12', address='翻斗大街翻斗花园二号楼1012', sex='男', age=64, salary=5863.136518032674, dataHired=2004-09-02}
Staff{name='张三9', address='翻斗大街翻斗花园二号楼109', sex='男', age=48, salary=8739.216839198101, dataHired=2006-01-15}
SecurityGuard{skills='巡逻校园', dangerousAllowance=200.47650075084667, name='张三3', address='翻斗大街翻斗花园二号楼103', sex='男', age=81, salary=4131.130394177577, dataHired=2006-07-20}
Staff{name='张三5', address='翻斗大街翻斗花园二号楼105', sex='女', age=73, salary=4467.609144333133, dataHired=2007-06-01}
Staff{name='张三1', address='翻斗大街翻斗花园二号楼101', sex='女', age=1, salary=5865.013286479973, dataHired=2009-01-24}
SecurityGuard{skills='查看健康码', dangerousAllowance=255.19945357671492, name='张三11', address='翻斗大街翻斗花园二号楼1011', sex='女', age=24, salary=10210.518851524717, dataHired=2010-06-02}
Dean{adminAward=733.5199557969281, name='张三8', address='翻斗大街翻斗花园二号楼108', sex='女', age=55, salary=4422.828379359303, dataHired=2012-07-13}
Dean{adminAward=932.3427637998242, name='张三4', address='翻斗大街翻斗花园二号楼104', sex='女', age=85, salary=1366.5247904880703, dataHired=2014-11-01}
Teacher{department='音乐系', speciality='电子琴系', postAllowance=435.8243423482432, name='张三2', address='翻斗大街翻斗花园二号楼102', sex='男', age=96, salary=5645.101089689207, dataHired=2017-09-17}
SecurityGuard{skills='保卫校园', dangerousAllowance=778.1411392841513, name='张三7', address='翻斗大街翻斗花园二号楼107', sex='男', age=31, salary=2784.756380796071, dataHired=2018-07-09}
Test类
package exp3;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import static java.lang.Math.random;
public class Test
{
static private int personNum = 4 * 3;
private static int id;
static String[] departments;
static HashMap<String, String[]> specialists;
static String[] skills;
static void init()
{
id = 0;
departments = new String[]{"中文系", "美术系", "音乐系", "计算机系"};
specialists = new HashMap<>();
specialists.put("中文系", new String[]{"汉语言文学", "汉语言", "秘书学"});
specialists.put("美术系", new String[]{"美术教育", "书法", "雕塑", "美术"});
specialists.put("音乐系", new String[]{"作曲系", "声乐系", "民声系", "钢琴系", "电子琴系"});
specialists.put("计算机系", new String[]{"软件工程", "网络工程", "计算机与科学", "智能科学与技术"});
skills = new String[]{"抓小偷", "使用防暴叉", "看门", "查看健康码", "巡逻校园", "保卫校园"};
}
static String getName()
{
return "张三" + (++id);
}
static String getAddress()
{
return "翻斗大街翻斗花园二号楼10" + id;
}
static String getSex()
{
return random() <= 0.5 ? "男" : "女";
}
static int getAge()
{
return (int) (random() * 100);
}
static double getSalary()
{
return random() * 10000;
}
static LocalDate getData()
{
int year = 2000 + (int) (random() * 22);
int month = 1 + (int) (random() * 11);
int day = 1 + (int) (random() * 27);
return LocalDate.of(year, month, day);
}
static double getPostAllowance()
{
return random() * 1000;
}
static String getDepartment()
{
return departments[(int) (random() * departments.length)];
}
static String getSpeciality(String department)
{
String[] speciality = specialists.get(department);
return speciality[(int) (random() * speciality.length)];
}
static String getSkill()
{
return skills[(int) (random() * skills.length)];
}
static double getDangerousAllowance()
{
return random() * 1000;
}
static double getAdminAward()
{
return random() * 1000;
}
public static void main(String[] args)
{
init();
Staff[] staffs = new Staff[personNum];
for (int i = 0; i < personNum; i += 4)
{
Staff staff = new Staff(getName(), getAddress(), getSex(), getAge(), getSalary(), getData());
String department = getDepartment();
Teacher teacher = new Teacher(getName(), getAddress(), getSex(), getAge(), getSalary(), getData(), department, getSpeciality(department), getPostAllowance());
SecurityGuard securityGuard = new SecurityGuard(getName(), getAddress(), getSex(), getAge(), getSalary(), getData(), getSkill(), getDangerousAllowance());
Dean dean = new Dean(getName(), getAddress(), getSex(), getAge(), getSalary(), getData(), department, getSpeciality(department), getPostAllowance(), getAdminAward());
staffs[i] = staff;
staffs[i + 1] = teacher;
staffs[i + 2] = securityGuard;
staffs[i + 3] = dean;
}
System.out.println("测试" + (int) (7.5 - 7.4));
System.out.println("打印名字-------------------------------------------- ");
printName(staffs);
System.out.println("打印薪水-------------------------------------------- ");
printSalary(staffs);
System.out.println("按照工资降序排序-------------------------------------------- ");
sortBySalary(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getSalary());
System.out.println("按照年龄升序排序-------------------------------------------- ");
sortByAge(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getAge());
System.out.println("按照名字升序排序-------------------------------------------- ");
sortByName(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getName());
System.out.println("按照日期升序排序-------------------------------------------- ");
sortByDateHired(staffs);
// print(staffs);
for(Staff i:staffs)
System.out.println(i.getDataHired());
}
public static void printName(Staff[] persons)
{
for (Staff staff : persons)
System.out.println(staff.getName());
}
public static void printSalary(Staff[] staffs)
{
for (Staff staff : staffs)
System.out.println(staff.getSumSalary());
}
//薪水降序
public static void sortBySalary(Staff[] staffs)
{
Arrays.sort(staffs, (Staff o1, Staff o2)->Double.compare(o2.getSumSalary(),o1.getSumSalary()));
}
public static void sortByAge(Staff[] staffs)
{
Arrays.sort(staffs,(Staff o1, Staff o2)->o1.getAge()-o2.getAge());
}
public static void sortByName(Staff[] staffs)
{
Arrays.sort(staffs, (Staff o1, Staff o2)->o1.getName().compareTo(o2.getName()));
}
public static void sortByDateHired(Staff[] staffs)
{
Arrays.sort(staffs, (Staff o1, Staff o2) ->o1.getDataHired().compareTo(o2.getDataHired()));
}
public static void print(Staff[] staffs)
{
for (Staff staff : staffs)
System.out.println(staff.toString());
System.out.println("\n\n");
}
}
测试数据设计
与问题二同
测试结果分析
与问题二同
五、实验小结
实验中遇到的问题及解决过程
无
实验中产生的错误及原因分析
无
实验体会和收获
掌握了接口的定义与实现;
熟悉了内部类机制;
学会使用Comparable、Comparator接口;
学会使用简单的Lambda表达式。