实验五 Java集合的应用

实验时间: 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,要求如下:

  1. 定义变量ArrayLIst类型保持Poker对象,并定义空参构造;
  2. 省略setter和getter方法;
  3. 定义showAll()方法显示成员变量ArrayList对象的所有内容;
  4. 定义成员方法sort()对成员变量ArrayList元素按照花色点数排序。

定义测试类,完成以下任务:

  1. 创建ArrayList对象al,有若干个不容的Poker对象;
  2. 创建Game对象,参数是al;
  3. 调用Game中的showAll()方法显示所有牌;
  4. 调用Game中的sort()方法对al进行排序

2.学生成绩管理

定义学生类(可以直接用之前定义过的)实现Comparable接口,要求:

  1. 成员变量包括学号id,姓名name,年龄age,课程成绩ArrayList(至少三门课的成绩);
  2. 定义构造方法初始化所有成员变量
  3. 省略getter和setter;
  4. 功能方法:重写Comparable接口中的compareTo()方法按照总分从大到小的顺序排序,重写toString方法返回学生的所有成员变量。

定义学生管理类Manager,要求:

  1. 成员变量包括TreeSet ts;
  2. 定义构造方法初始化成员变量
  3. 定义功能方法:show()显示集合ts中的学生的学号、姓名、年龄、每门课程的成绩、总成绩,定义add(Student stu)方法把一个学生信息添加到ts中,利用remove(Student stu)方法删除一个学生,search(String id)方法根据学号查找学生。

定义测试类Demo,调用add()方法添加至少10个学生信息,调用show()方法显示学生信息,调用remove(String std)方法删除学生信息,调用search(String id)查找某学生信息。

【详细分析】

  1. 处理扑克牌

自定义排序方法,定义一个类继承comparator<T>接口,重写compare方法,调用Collections.Sort方法,传递的参数需要有刚才的类定义的对象

  1. 在定义TreeSet时重写compare方法,更改为合适的规则。同时将student类中的compareTo方法重写,更改比较规则。

【实验源码】

  1. 处理扑克牌

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();

    }

}
  1. 学生成绩管理

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");

    }

}

【实验结果】

  1. 处理扑克牌类

  1. 学生成绩管理

【实验体会】

       本次实验,学习了两种对类内部成员进行排序的方法,两种方法的实现方式不同一种需要创建一个类,并新建一个对象类似于c++中的sort是外部排序。另一种是创建对象时对compare进行重写,即对比较的规则进行重新定义。收获很大。

参考资料

来吧,一文彻底搞懂Java中的Comparable和Comparator - 沉默王二的文章 - 知乎 https://zhuanlan.zhihu.com/p/101583223

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
掌握集合的概念、体系结构、分类及使用场景 2)了解Set接口及主要实现类(HashSet、TreeSet) 3)了解List接口及主要实现类(ArrayList、LinkedList、Vector) 4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王 身份证号:178880002 姓名:李四 身份证号:178880003 姓名:王 身份证号:178880002 姓名:李四 身份证号:178880004 注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:name:Person对象的姓名,id:Person对象的身份证号) 主方法中作如下测试: 1)创建一个可放置Person类对象的HashSet; 2)依次添加上述5个对象到HashSet中; 3)把集合中的元素打印出来(使用迭代器Iterator) 2、编写程序练习List集合的基本使用: 1) 创建一个只能容纳String对象名为names的ArrayList集合; 2)按顺序往集合中添加5个字符串对象:"张三"、"李四"、"王"、"马六"、"赵七"; 3)对集合进行遍历,分别打印集合中的每个元素的位置与内容; 4)打印集合的大小,然后删除集合中的第3个元素,并显示删除元素的内容,然后再打印目前集合中第3个元素的内容,并再次打印集合的大小。 3、编写程序练习Map集合的基本使用: 1)创建一个只能容纳String对象的person的HashMap集合; 2)往集合中添加5个"键-值"对象: "id"-"1"; "name"-"张三"; "sex"-"男"; "age"-"25"; "hobby"-"爱学Java" 3)对集合进行遍历,分别打印集合中的每个元素的键与值; 4)打印集合的大小,然后删除集合中的键为age的元素,并显示删除元素的内容,并再次打印集合的大小。 四、思考题 1、集合中的List、Set、Map有哪些不同? 2、为什么使用集合框架,而尽可能少用数组作为存储结构? 3、如何使用TreeSet实现第一题?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值