除了List之外,Set集合接口也经常使用,Set接口中存放的元素是无序的并且是不可重复的,因此被称为数据集;

  Set接口因为是无序的,所以没有提供像List一样的set方法来修改元素,查找,添加、删除是没问题的

  下面利用Set来演示一下学生选课的简单示例:

  课程类,Course.java

 /*
* 课程类,规定课程结构,用于向集合中传入此类型的元素
*/ public class Course {
public String id;
public String name;
public Course(String id,String name){
//含参构造方法
this.id = id;
this.name = name;
} public Course(){
//无参构造器,为了子类初始化隐式构造方法
}
}

  学生类,包括学号、属性、所选课程(利用Set集合存放),Student.java

 import java.util.HashSet;
import java.util.Set; /*
* 学生类
*/ public class Student {
public String id;
public String name;
public Set<Course> courses; //定义Set类型的集合用于存放所选课程 public Student(String id,String name){
this.id = id;
this.name = name;
this.courses = new HashSet<Course>(); //通过HashSet方法实例化Set类型的引用
}
}

  同样利用了泛型,规定了Set集合存放学生所选的课程属性的类型

  操作Set集合的类,SetTest.java

 import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner; public class SetTest { public List<Course> coursesToSelect;
public SetTest(){
this.coursesToSelect = new ArrayList<Course>();
}
public void testAdd(){
Course cr1 = new Course("1","数据结构");
coursesToSelect.add(cr1); //添加属性到List中,位置0 Course cr2 = new Course("2","C语言");
coursesToSelect.add(1,cr2); Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")}; //创建一个课程类数组,存放多个对象
coursesToSelect.addAll(Arrays.asList(course)); //把数组转成List传递到courseToSelect属性中 Course[] course2 = {new Course("5","高等数学"),new Course("6","算法分析")};
coursesToSelect.addAll(4,Arrays.asList(course2));
} /*
* 遍历List中的元素
*/
public void testForeach(){
System.out.println("所有课程:");
for(Course cr : this.coursesToSelect){
System.out.println("课程:" + cr.id + ":" + cr.name);
}
} public static void main(String[] args){
SetTest st = new SetTest();
st.testAdd();
st.testForeach(); //创建学生对象
Student stu = new Student("201201100838","小颖");
System.out.println("欢迎你!" + stu.name + " 学号:" + stu.id); //接收课程输入
Scanner console = new Scanner(System.in); for(int i = 0;i < 3;i++){
System.out.println("请输入课程ID:");
String courseid = console.next();
//遍历比对
for(Course cr : st.coursesToSelect){
if(cr.id.equals(courseid)){
stu.courses.add(cr); //添加所选课程 //重复添加不生效,相当于没添加,多个相同对象引用只保留一个
stu.courses.add(cr); //stu.courses.add(null); //传入空值也是可以的
}
}
}
console.close(); //关闭输入
int num = stu.courses.size();
System.out.println("共选了" + num + "门课程,列表如下:");
st.SetForeach(stu); } /*
* 遍历Set中的元素只能用foreach方法或者迭代器方法,不能用get方法,因为Set中元素排列是无序的,不可能根据索引查询
* 并且最终每次输出也是无序的
*/ public void SetForeach(Student stu){
for(Course cr:stu.courses){
System.out.println(cr.id + ":" + cr.name);
}
}
}

  上面的程序就可以实现选课的简单功能,首先初始化备选课程放入List中,然后进行输入比对,存入学生类中Set中,然后利用foreach遍历出Set中的结果,实现的选课内容的输出,效果如下:

  

  Set接口使用和List基本一致,显著特点就是Set中的元素无序并且不可重复,需要注意的地方就是,例子中对对象进行了重复添加,但是没有任何作用,重复添加多个相同对象时,Set中只保留一个,另外添加null空指针也是可以的;Set中元素因为其无序性,所以不能用get方法来查找,只能通过foreach或者iterator方法遍历,并且根据结果可以看出,每次输出结果顺序也是不一样的

Java中Set集合的使用的更多相关文章

  1. Java 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

  2. 实现java 中 list集合中有几十万条数据,每100条为一组取出

    解决"java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!"的问题. 具体解决方案如下: /** * 实现java 中 list集合中有几十万条 ...

  3. java中对集合对象list的几种循环访问

    java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...

  4. 菜鸟日记之 java中的集合框架

    java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...

  5. C#与java中的集合区别

    集合一般的操作       插入: add       删除: remove       查找: contains,remove java中的集合 注意哪些是接口,哪些是实现类 使用集合的时候 1. ...

  6. java中list集合的内容,如何使用像数据库中group by形式那样排序

    java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    mone ...

  7. Java中的集合类型的继承关系图

    Java中的集合类型的继承关系图

  8. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  9. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  10. Java中的集合概述

    Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...

随机推荐

  1. Ibatis -- 一次执行多条SQL

    <statement id="DeleteAccount" parameterClass="Account"> BEGIN DELETE FROM ...

  2. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

  3. BZOJ1202 狡猾的商人

    HNOI2005 Day1 T4 Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1, ...

  4. 通知栏Notification的学习

    转:http://blog.csdn.net/yczz/article/details/28416893 在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理 ...

  5. C# WPF 显示图片和视频显示 EmuguCv、AForge.Net测试(续)

    介绍 本文是接着上文<C# WPF 显示图片和视频显示 EmuguCv.AForge.Net测试>写的,建议先看下上文,因为有些代码还需要了解. 增添 接着上文的代码,我们可以在事件处理方 ...

  6. Weka算法Classifier-tree-J48源代码分析(一个)基本数据结构和算法

    大约一年,我没有照顾的博客,再次拿起笔不知从何写上,想来想去手从最近使用Weka要正确书写. Weka为一个Java基础上的机器学习工具.上手简单,并提供图形化界面.提供如分类.聚类.频繁项挖掘等工具 ...

  7. mysql prepare语句使用

    语法 PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...] ...

  8. java 线程---成员变量与局部变量

    关于成员变量与局部变量: 如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程) . 如果一个变量是局 ...

  9. spring 注解简单使用

    一.通用注解 1.项目结构: 2.新建Person类,注解@Component未指明id,则后期使用spring获取实例对象时使用默认id="person"方式获取或使用类方式获取 ...

  10. go runtime scheduler

     http://www.slideshare.net/matthewrdale/demystifying-the-go-scheduler http://www.cs.columbia.edu/~a ...