您的位置:首页 > 编程语言 > Java开发

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

2016-10-04 22:41 375 查看
好悲催啊,国庆不想回家,就只有宅在寝室跟自己玩了。空间里朋友圈里都在秀旅游,有去重庆的,有去上海的。

不过还好我这几天是有准备的—-跟代码一起玩耍呗。哈哈哈哈哈~

我是真的感觉自己好菜,大学也没学,只是感觉要毕业了,有了点外面不好混的感觉,就赶紧努力学习了,不想去外面做苦力啊呵呵呵。

以前一直没搞懂集合,今天跟着视频学了学,再在博客上写出来,也算是一种积累吧~

下图是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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 博客