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