实验时间: 2022.10.21
【实验目的】
(1)理解List的应用场合。
(2)掌握Comparable和Comparator接口的使用方法。
(3)掌握迭代器接口Iterator和ListIterator遍历集合的方法
【实验环境】
JDK、Eclipse
【实验内容】
1.处理扑克牌
每张扑克牌有点数和花色,定义Poker类,要求如下:
(1)成员变量包括点数(point)和花色(color);
(2)定义构造方法初始化所有成员变量;
(3)省略setter,定义getter()方法;
(4)重写toString()方法返回扑克牌的信息。
定义PokerComparator类实现Comparator接口,重写compare(Object obj1,Object obj2)方法,首先按照花色排序,如果花色相同则按照点数从大到小排序。
定义游戏类Game,要求如下:
- 定义变量ArrayLIst类型保持Poker对象,并定义空参构造;
- 省略setter和getter方法;
- 定义showAll()方法显示成员变量ArrayList对象的所有内容;
- 定义成员方法sort()对成员变量ArrayList元素按照花色点数排序。
定义测试类,完成以下任务:
- 创建ArrayList对象al,有若干个不容的Poker对象;
- 创建Game对象,参数是al;
- 调用Game中的showAll()方法显示所有牌;
- 调用Game中的sort()方法对al进行排序
2.学生成绩管理
定义学生类(可以直接用之前定义过的)实现Comparable接口,要求:
- 成员变量包括学号id,姓名name,年龄age,课程成绩ArrayList(至少三门课的成绩);
- 定义构造方法初始化所有成员变量
- 省略getter和setter;
- 功能方法:重写Comparable接口中的compareTo()方法按照总分从大到小的顺序排序,重写toString方法返回学生的所有成员变量。
定义学生管理类Manager,要求:
- 成员变量包括TreeSet ts;
- 定义构造方法初始化成员变量
- 定义功能方法:show()显示集合ts中的学生的学号、姓名、年龄、每门课程的成绩、总成绩,定义add(Student stu)方法把一个学生信息添加到ts中,利用remove(Student stu)方法删除一个学生,search(String id)方法根据学号查找学生。
定义测试类Demo,调用add()方法添加至少10个学生信息,调用show()方法显示学生信息,调用remove(String std)方法删除学生信息,调用search(String id)查找某学生信息。
【详细分析】
- 处理扑克牌
自定义排序方法,定义一个类继承comparator<T>接口,重写compare方法,调用Collections.Sort方法,传递的参数需要有刚才的类定义的对象
- 在定义TreeSet时重写compare方法,更改为合适的规则。同时将student类中的compareTo方法重写,更改比较规则。
【实验源码】
- 处理扑克牌
Poker类
package ex.t01;
public class Poker {
private char point;
private String color;
public Poker(char point, String color) {
this.point = point;
this.color = color;
}
public char getPoint() {
return point;
}
public String getColor() {
return color;
}
@Override
public String toString() {
return "Poker{" +
"point=" + point +
", color='" + color + '\'' +
'}';
}
}
PokerComparator类
package ex.t01;
import java.util.Comparator;
public class PokerComparator implements Comparator<Poker> {
@Override
public int compare(Poker o1, Poker o2) {
int compareColor = o2.getColor().compareTo(o1.getColor());
if (compareColor != 0) {
return compareColor;
} else {
return o2.getPoint() - o1.getPoint();
}
}
}
Game类
package ex.t01;
import java.util.ArrayList;
import java.util.Collections;
public class Game {
private ArrayList<Poker> PokerList;
public Game(ArrayList<Poker> pokerList) {
PokerList = pokerList;
}
public void showAll(){
System.out.println(PokerList);
}
public void sort(){
Collections.sort(PokerList,new PokerComparator());
}
}
Test类
package ex.t01;
import java.util.ArrayList;
public class test {
static public void main(String arg[]) {
ArrayList<Poker> al = new ArrayList<Poker>();
al.add(new Poker('3', "黑桃"));
al.add(new Poker('6', "黑桃"));
al.add(new Poker('3', "红心"));
al.add(new Poker('7', "梅花"));
al.add(new Poker('8', "方块"));
al.add(new Poker('K', "黑桃"));
al.add(new Poker('K', "方块"));
Game game=new Game(al);
System.out.println("排序前:");
game.showAll();
game.sort();
System.out.println("排序后");
game.showAll();
}
}
- 学生成绩管理
Student类
package chq.ex.t02;
import java.util.ArrayList;
import java.lang.Comparable;
import java.util.Arrays;
import java.util.Iterator;
public class Student implements Comparable<Student> {
private String id;
private String name;
private int age;
private ArrayList<Integer> courseGrade;
public Student(String id, String name, int age, ArrayList<Integer> courseGrade) {
this.id = id;
this.name = name;
this.age = age;
this.courseGrade = courseGrade;
}
public Student(String id, String name, int age, Integer[] grade) {
this.id = id;
this.name = name;
this.age = age;
this.courseGrade = new ArrayList<Integer>(Arrays.asList(grade));
}
public int getGrade() {
Iterator<Integer> it = courseGrade.iterator();
int sum = 0;
while (it.hasNext()) {
sum += it.next();
}
return sum;
}
public String getId() {
return id;
}
@Override
public int compareTo(Student o) {
return this.getGrade() - o.getGrade();
}
@Override
public String toString() {
return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", courseGrade=" + courseGrade + '}';
}
}
Manager类
package ex.t02;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class Manager {
private TreeSet<Student> ts;
public Manager(TreeSet<Student> ts) {
this.ts = ts;
}
public Manager() {
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return ((Student) o1).getId().compareTo(((Student) o2).getId());
}
});
this.ts = ts;
}
public void show() {
for (Iterator<Student> it = ts.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
public void add(Student stu) {
if (ts.contains(stu)) {
System.out.println("false");
}
ts.add(stu);
}
public void remove(Student stu) {
ts.remove(stu);
}
public void search(String id) {
for (Student stu : ts) {
if (stu.getId() == id) {
System.out.println("ID是" + id + "的学生信息是:");
System.out.println(stu.toString());
return;
}
}
System.out.println("学生信息未找到:");
}
}
Demo类
package ex.t02;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
Manager manager = new Manager();
manager.add(new Student("0001", "小明", 20, new Integer[]{43, 65, 76}));
manager.add(new Student("0002", "小红", 21, new Integer[]{65, 23, 43}));
manager.add(new Student("0003", "小刚", 21, new Integer[]{75, 23, 61}));
manager.add(new Student("0004", "小强", 20, new Integer[]{69, 37, 48}));
manager.add(new Student("0005", "小志", 20, new Integer[]{87, 84, 43}));
manager.add(new Student("0006", "小王", 21, new Integer[]{69, 82, 81}));
manager.add(new Student("0007", "小朋", 20, new Integer[]{68, 87, 73}));
manager.add(new Student("0008", "小华", 19, new Integer[]{98, 80, 83}));
manager.add(new Student("0009", "小智", 20, new Integer[]{67, 89, 93}));
manager.add(new Student("0010", "小莉", 20, new Integer[]{95, 99, 100}));
System.out.println("学生信息是:");
manager.show();
manager.remove(new Student("0006", "小王", 21, new Integer[]{69, 82, 81}));
System.out.println("删去后的学生信息是:");
manager.show();
manager.search("0006");
manager.search("0009");
}
}
【实验结果】
- 处理扑克牌类
- 学生成绩管理
【实验体会】
本次实验,学习了两种对类内部成员进行排序的方法,两种方法的实现方式不同一种需要创建一个类,并新建一个对象类似于c++中的sort是外部排序。另一种是创建对象时对compare进行重写,即对比较的规则进行重新定义。收获很大。
参考资料
来吧,一文彻底搞懂Java中的Comparable和Comparator - 沉默王二的文章 - 知乎 https://zhuanlan.zhihu.com/p/101583223