我的JAVA初学之路----List集合和Set集合(上)

好悲催啊,国庆不想回家,就只有宅在寝室跟自己玩了。空间里朋友圈里都在秀旅游,有去重庆的,有去上海的。
不过还好我这几天是有准备的—-跟代码一起玩耍呗。哈哈哈哈哈~
我是真的感觉自己好菜,大学也没学,只是感觉要毕业了,有了点外面不好混的感觉,就赶紧努力学习了,不想去外面做苦力啊呵呵呵。
以前一直没搞懂集合,今天跟着视频学了学,再在博客上写出来,也算是一种积累吧~

下图是JAVA集合框架中的两大家族以及子类的关系:

这里写图片描述

*Q:那么我们为什么要使用集合呢?

A:因为数组只能存放基本数据类型的数据,然而JAVA可不止那么简单,当我们要存放具体的对象时,就必须要使用集合了。

Q:那么List和Set有什么区别?

A:List中存放的是有序的对象;Set中存放的都是无序的对象,并且不允许同样的元素存在。

Q:在使用集合的过程中要注意哪些问题?

A:在目前我的学习当中,要注意的就是不能使用int这些基本类型作为泛型类型,如要使用就必须使用它们的包装类,比如List<Integer> list;

接下来我就用刚学到的学生选课实例来演示怎样使用List和Set集合实现增删改查:

首先我们新建两个封装类Student和Course:

public class Course {

private String id;
    private String name;

    public Course(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

要在Student类里写一个Set集合用来存放学生选好的课程,它的泛型是Course,也就是说它不接受除了Course和Course子类以外的任何类型,这里需要注意:

public class Student {

    private String id;
    private String name;
    public Set<Course> courses;

    public Student(String id, String name, Set courses) {
        super();
        this.id = id;
        this.name = name;
        this.courses = new HashSet<>();
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set getCourses() {
        return courses;
    }
    public void setCourses(Set courses) {
        this.courses = courses;
    }
}

然后我们新建一个测试类用来创建我们的添加课程和选择课程:

首先在构造方法中初始化我们的List以便使用

public class Test {

    public List<Course> courseList;

    public Test(){
        //初始化List
        courseList = new ArrayList<>();
    }

新建一个方法添加课程

    public void addCourse(){
        //新建Course对象作为List的数据源
        Course c1 = new Course("1", "JAVA基础");
        Course c2 = new Course("2", "JAVA进阶");
        Course c3 = new Course("3", "JAVA WEB");
        Course c4 = new Course("4", "JAVA高级");
        Course c5 = new Course("5", "Android入门");
        Course c6 = new Course("6", "Android高级");
        //添加新建好的Course对象到List中
        courseList.add(c1);
        courseList.add(c2);
        courseList.add(c3);
        courseList.add(c4);
        courseList.add(c5);
        courseList.add(c6);
    }

新建选课方法:

public void chooseCourse() {
        // 添加学生
        Student student = new Student("A001", "JoeGreen");
        System.out.println("欢迎" + student.getName());
        // 接收用户输入
        Scanner sc = new Scanner(System.in);
        // 这里我设定每个学生选三门课
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入课程Id:");
            String chooseId = sc.next();
            // 使用for each循环(增强型)遍历出每门课程
            for (Course course : courseList) {
                // 如果得到的课程Id和选中的课程Id一样就添加进Set集合里
                if (course.getId().equals(chooseId)) {
                    student.courses.add(course);
                }
            }
        }
        //遍历Set集合,打印出已选好的课程
        for (Course course : student.courses) {
            System.out.println("你选择了:" + course.getName());
        }
    }

在main方法中测试:

public static void main(String[] args) {
        Test t = new Test();
        t.addCourse();
        t.foreachCourse();
        t.chooseCourse();
    }

这里写图片描述

集合的删除调用remove(int index);方法,插入调用set(int index, Eelement);方法。详细可以去查看官方API文档。

测试下Set元素的不可重复性:

for (int i = 0; i < 3; i++) {
            System.out.println("请输入课程Id:");
            String chooseId = sc.next();
            // 使用for each循环(增强型)遍历出每门课程
            for (Course course : courseList) {
                // 如果得到的课程Id和选中的课程Id一样就添加进Set集合里
                if (course.getId().equals(chooseId)) {
                    student.courses.add(course);
                    student.courses.add(course); //添加两次
                }
            }
        }
        //遍历Set集合,打印出已选好的课程
        for (Course course : student.courses) {
            System.out.println("你选择了:" + course.getName());
        }
        System.out.println("你总共选择了" + student.courses.size() + "门课"); //打印Set的长度
    }

不出意外,结果只有三次

这里写图片描述

我们来测试下Set的无序性:

这里写图片描述

同样的课,两次输出的顺序是一样的。这是由于JDK在新版中更改了这个特性。

好了,今天的巩固就到这里了。
PS:刚刚犯了一个无比低级的错误,就因为添加课程的时候把id写成1. 然后选课的时候一直遍历不出来选好的课。。。尴尬啊哈哈哈。

HashMap<Student, String> studentlist = new HashMap<Test1.Student, String>();
    TreeSet<Course> courseList = new TreeSet<Test1.Course>();
    Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        Test1 t1 = new Test1();
        t1.addStudent();
        t1.addCourse();
        t1.chooseCourse();
    }

    public void addStudent() {
        System.out.println("这里是选课系统,请输入学号:");
        int id = sc.nextInt();
        System.out.println("请输入姓名:");
        String name = sc.next();
        Student st = new Student(id, name);
        studentlist.put(st, name);
        System.out.println("欢迎你" + st.getName());
    }

    public void addCourse() {
        System.out.println("下面是可选课程:");
        Course c1 = new Course(1, "JAVA基础");
        Course c2 = new Course(2, "JAVA入门");
        Course c3 = new Course(3, "JAVA进阶");
        Course c4 = new Course(4, "JAVA高级");
        Course c5 = new Course(5, "JAVAWEB");
        courseList.add(c1);
        courseList.add(c2);
        courseList.add(c3);
        courseList.add(c4);
        courseList.add(c5);
        for (Course course : courseList) {
            String name = course.getName();
            System.out.println(course.id + ":" + name);
        }
    }

    public void chooseCourse() {
        Student s = new Student();
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入要选的课程Id(重复id只会添加一项):");
            int id = sc.nextInt();
            //必须通过for each或者iterator迭代出来每个元素,因为Set集合是无序的。
            for (Course course : courseList) {
                if(course.id == id){
                    s.courses.add(course);
                }
            }
        }
        for (Course course : s.courses) {
            System.out.println("选择了课程" + course.id + ":" + course.name);
        }
    }

    class Course implements Comparable<Course> {
        private int id;
        private String name;
        public List<Course> coursel = new ArrayList<Test1.Course>();

        @Override
        public String toString() {
            return "Course [id=" + id + ", name=" + name + "]";
        }

        public Course() {
        }

        public Course(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + getOuterType().hashCode();
            result = prime * result + id;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Course other = (Course) obj;
            if (!getOuterType().equals(other.getOuterType()))
                return false;
            if (id != other.id)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }

        private Test1 getOuterType() {
            return Test1.this;
        }

        public int compareTo(Course o) {
            if (this.id > o.id) {
                return 1;
            } else if (this.id == o.id) {
                return 0;
            } else {
                return -1;
            }
        }

    }

    class Student {
        private int id;
        private String name;
        //添加课程到学生表
        public Set<Course>  courses = new TreeSet<Course>();

        public Student(){

        }
        public Student(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + "]";
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + getOuterType().hashCode();
            result = prime * result + id;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Student other = (Student) obj;
            if (!getOuterType().equals(other.getOuterType()))
                return false;
            if (id != other.id)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }

        private Test1 getOuterType() {
            return Test1.this;
        }

    }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值