• Java中Set集合的使用


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

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

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

      课程类,Course.java

     1 /*
     2  * 课程类,规定课程结构,用于向集合中传入此类型的元素
     3  */
     4 
     5 public class Course {
     6     public String id;
     7     public String name;
     8     public Course(String id,String name){
     9         //含参构造方法
    10         this.id = id;
    11         this.name = name;
    12     }
    13     
    14     public Course(){
    15         //无参构造器,为了子类初始化隐式构造方法
    16     }
    17 }

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

     1 import java.util.HashSet;
     2 import java.util.Set;
     3 
     4 /*
     5  * 学生类
     6  */
     7 
     8 public class Student {
     9     public String id;
    10     public String name;
    11     public Set<Course> courses;    //定义Set类型的集合用于存放所选课程
    12     
    13     public Student(String id,String name){
    14         this.id = id;
    15         this.name = name;
    16         this.courses = new HashSet<Course>();    //通过HashSet方法实例化Set类型的引用
    17     }
    18 }

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

      操作Set集合的类,SetTest.java

     1 import java.util.ArrayList;
     2 import java.util.Arrays;
     3 import java.util.List;
     4 import java.util.Scanner;
     5 
     6 public class SetTest {
     7     
     8     public List<Course> coursesToSelect;
     9     public SetTest(){
    10         this.coursesToSelect = new ArrayList<Course>();
    11     }
    12     public void testAdd(){
    13         Course cr1 = new Course("1","数据结构");
    14         coursesToSelect.add(cr1);    //添加属性到List中,位置0
    15         
    16         Course cr2 = new Course("2","C语言");
    17         coursesToSelect.add(1,cr2);
    18 
    19         
    20         Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};    //创建一个课程类数组,存放多个对象
    21         coursesToSelect.addAll(Arrays.asList(course));    //把数组转成List传递到courseToSelect属性中
    22         
    23         Course[] course2 = {new Course("5","高等数学"),new Course("6","算法分析")};
    24         coursesToSelect.addAll(4,Arrays.asList(course2));
    25     }
    26     
    27     /*
    28      * 遍历List中的元素
    29      */
    30     public void testForeach(){
    31         System.out.println("所有课程:");
    32         for(Course cr : this.coursesToSelect){
    33             System.out.println("课程:" + cr.id + ":" + cr.name);
    34         }
    35     }
    36     
    37     public static void main(String[] args){
    38         SetTest st = new SetTest();
    39         st.testAdd();
    40         st.testForeach();
    41         
    42         //创建学生对象
    43         Student stu = new Student("201201100838","小颖");
    44         System.out.println("欢迎你!" + stu.name + "  学号:" + stu.id);
    45         
    46         //接收课程输入
    47         Scanner console = new Scanner(System.in);
    48         
    49         for(int i = 0;i < 3;i++){
    50             System.out.println("请输入课程ID:");
    51             String courseid = console.next();
    52             //遍历比对
    53             for(Course cr : st.coursesToSelect){
    54                 if(cr.id.equals(courseid)){
    55                     stu.courses.add(cr);    //添加所选课程
    56                     
    57                     
    58                     //重复添加不生效,相当于没添加,多个相同对象引用只保留一个
    59                     stu.courses.add(cr);
    60                     
    61                     //stu.courses.add(null);    //传入空值也是可以的
    62                 }
    63             }
    64         }
    65         console.close();    //关闭输入
    66         int num = stu.courses.size();
    67         System.out.println("共选了" + num + "门课程,列表如下:");
    68         st.SetForeach(stu);
    69         
    70         
    71         
    72     }
    73     
    74     /*
    75      * 遍历Set中的元素只能用foreach方法或者迭代器方法,不能用get方法,因为Set中元素排列是无序的,不可能根据索引查询
    76      * 并且最终每次输出也是无序的
    77      */
    78     
    79     public void SetForeach(Student stu){
    80         for(Course cr:stu.courses){
    81             System.out.println(cr.id + ":" + cr.name);
    82         }
    83     }
    84 }

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

      

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

  • 相关阅读:
    高斯消元
    丑数
    扩展欧几里得算法与线性同余方程
    数论-求逆元
    数论-快速幂-快速乘
    宋逸轩长难句 2
    宋逸轩长难句 1
    c语言 文件
    c语言程序结构
    c语言结构类型
  • 原文地址:https://www.cnblogs.com/freeweb/p/4836587.html
Copyright © 2020-2023  润新知