集合框架(下)

 

1.判断List中的课程是否存在(在SetTest类中)

 

    //测试List的contains方法(某个序列是否包含某个对象)
    public void testListContains(){
        //取得备选课程的第0个元素
        Course course = CourseToSelect.get(0);
        //打印输出CourseToSelect是否包含course对象
        System.out.println("取得课程"+course.name);
        System.out.println("备选课程中是否包含:"+course.name+","+CourseToSelect.contains(course));
        //创建一个新的课程对象,课程的ID和name和course相同
        Course course2 = new Course(course.id,course.name);
        System.out.println("新课程:"+course2.id+","+course2.name);
        System.out.println("备选课程中是否包含:"+course2.name+","+CourseToSelect.contains(course2));
            
    }

 

Contains方法:是从原来List中取出的元素才可以显示为true,即使建立新的对象中含有的内容和原List中含有对象的内容相同,也返回的事false。(因为java中所有的类都继承Object,而Object类中的equals判断内容是否相同。在Contains中是先取出元素elements再equals比较。)

改写Course类中的equals方法(如果是课程对象内容相同则都返回true)

package com.collection;

public class Course {
    public String id;
    public String name;
    public Course(String id,String name)
    {
        this.id=id;
        this.name=name;
    }
    public Course(){
        
    }
    
    @Override
    public boolean equals(Object obj){
        if(this == obj){
            return true;
        }
        if(obj == null){
            return false;
        }
        if(!(obj instanceof Course)){
            return false;
        }
        Course course = (Course) obj;
        if(this.name==null){
            if(course.name==null){
                return true;
            }
            else{
                return false;
            }
        }else{
            if(this.name.equals(course.name)){
                return true;
            }else{
                return false;
            }
        }
        
    }
    

}

2.通过改写equlas方法,实现了从控制台输入课程对象,测试原课程CourseToSelect中是否包含新建的课程对象’

    //测试List的contains方法(某个序列是否包含某个对象)
    public void testListContains(){
        //取得备选课程的第0个元素
        Course course = CourseToSelect.get(0);
        //打印输出CourseToSelect是否包含course对象
        System.out.println("取得课程"+course.name);
        System.out.println("备选课程中是否包含:"+course.name+","+CourseToSelect.contains(course));
        
        
        //提示输出课程名称
        System.out.println("请输入课程名称");
        String name = console.next();
        //创建一个新的课程对象,课程的ID和name和course相同
        Course course2 = new Course();
        course2.name=name;
        System.out.println("新课程:"+course2.name);
        System.out.println("备选课程中是否包含:"+course2.name+","+CourseToSelect.contains(course2));
            
    }

 3.通过Set的Contains方法查看选课名字中是否学生已选这门课程

//创建学生对象并且选课
    public void createStudentAndSelectCours(){
        student = new Student("1","小明");
        System.out.println("欢迎同学:"+student.name+"选课!");
        //创建Scanner对象,用于从键盘中输入课程的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 : CourseToSelect) {
                if(cr.id.equals(courseId)){
                    student.courses.add(cr);
                }    
            }
        }
        
    }
//测试Set的Contains方法
    public void testSetContains(){
        // 提示输入课程名字
        System.out.println("请输入课程名字");
        String name = console.next();
        Course  course = new Course();
        course.name=name;
        //打印输出新课程的名字 
        System.out.println("新课程的名字:"+course.name);
        System.out.println("备选课程中是否包含:"+course.name+student.courses.contains(name));
    }
    

注:Object类中包含hashCode()方法,而Contain()方法先查看元素Element之后调用hashCode(),首先查看哈希编码是否一致,如果不一致则返回false,如果一致再调用equals()  。在这段代码中是先比较了哈希编码,不一致,则返回了false

如果想显示为true则需要重新写hashCode()方法,在Course类中右击源码,选择重写hashCode和equals方法即可

4.查找元素的索引位置indexOf和lastIndexOf

 以indexOf为例,如果List中含有多个相同的元素,则index返回第一个元素的索引位置,如果没有匹配的元素则返回-1

5.Map中的containsKey和containsValue方法

public void testMapContiansKeyOrValue(){
        //提示用户输入需要查找的学生ID
        System.out.println("请输入需要查找 的学生的ID");
        Scanner console = new Scanner(System.in);
        String id = console.next();
        System.out.println("您输入学生ID:"+id+"对应学生映射中是否存在:"+students.containsKey(id));
        if(students.containsKey(id)){
            System.out.println("对应学生姓名为"+students.get(id).name);
        }
        //提示用户输入需要查询的学生姓名
        System.out.println("请输入需要查找的学生的名字");
        Scanner console2 = new Scanner(System.in);
        String name = console2.next();
        if(students.containsValue(new Student(null,name))){
            System.out.println("确实存在学生"+name);
            
        }
        else{
            System.out.println("不存在该学生");
        }
        
    }
    

 

注:相同的是 也需要重写hashCode 和equals方法

下面是重写的代码(自动生成):

package com.collection;

import java.util.HashSet;
import java.util.Set;

/**
 * @学生类
 *
 */


public class Student {
    
    public String id;
    public String name;
    public Set<Course> courses;
    
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        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 (!(obj instanceof Student))
            return false;
        Student other = (Student) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }


    public Student(String id,String name)
    {
        this.id=id;
        this.name=name;
        this.courses=new HashSet<Course>();
    }

}

 5.Collection的sort()排序方法

  01):对Interger泛型的List进行排序

//通过collection的Sort方法,对Interger泛型的List进行排序
    //产生了10个100内不重复的整数,存入到List中,在进行排序
    public void testSort1(){
        List<Integer> integerList = new ArrayList<>();
        Random random = new Random();
        Integer k;
        for(int i=0;i<10;i++){
            do{
                k=random.nextInt(100);
            }while(integerList.contains(k));
            integerList.add(k);
            System.out.println("成功添加整数:"+k);
        }
        System.out.println("---------排序前----------:");
         for (Integer integer : integerList) {
            System.out.print(integer+",");
        }
         System.out.println();
         System.out.println("---------排序后---------:");
         Collections.sort(integerList);
         for (Integer integer : integerList) {
                System.out.print(integer+",");
            }
        
    }
    

02):对String类型的进行排序

//测试String类型的List
    public void testSort2(){
        List<String> stringList = new ArrayList();
        stringList.add("my");
        stringList.add("his");
        stringList.add("your");
        stringList.add("His");
        System.out.print("---排序前---:");
        for (String string : stringList) {
            System.out.print(string+",");
        }
         System.out.println();
        Collections.sort(stringList);
        System.out.print("---排序后---:");
        for (String string : stringList) {
            System.out.print(string+",");
        }
    }
    

注:排列顺序:数字(0-9),大写字母,小写字母

03):对其他类型的进行排序,以Student类型为例子

------Comparable

 

 

package com.collection;

import java.util.HashSet;
import java.util.Set;

/**
 * @学生类
 *
 */


public class Student implements Comparable<Student> {
    
    public String id;
    public String name;
    public Set<Course> courses;
    


    public Student(String id,String name)
    {
        this.id=id;
        this.name=name;
        this.courses=new HashSet<Course>();
    }


    @Override
    public int compareTo(Student o) {
        // TODO 自动生成的方法存根
        return this.id.compareTo(o.id);
    }

}

 

 

 

// 其他类型的泛型排序,以Student类型为例子
    public void testSort3(){
        List<Student> studentList = new ArrayList();
        Random random = new Random();
        studentList.add(new Student(random.nextInt(1000)+"","Mike"));
        studentList.add(new Student(random.nextInt(1000)+"","Amy"));
        studentList.add(new Student(random.nextInt(1000)+"","Lucy"));
        studentList.add(new Student(1000+"","Beyone"));
        System.out.println("----排序前----:");
        for (Student student : studentList) {
            System.out.println(student.id+","+student.name);
        }
        System.out.println();
        System.out.println("---- 排序后----");
        Collections.sort(studentList);
        for (Student student : studentList) {
            System.out.println(student.id+","+student.name);
        }
    }

原因:

 --------Comparactor

package com.collection;

import java.util.Comparator;

public class StudentComparactor implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        // TODO 自动生成的方法存根
        return o1.name.compareTo(o2.name);
    }

}
    // 其他类型的泛型排序,以Student类型为例子
    public void testSort3(){
        List<Student> studentList = new ArrayList();
        Random random = new Random();
        studentList.add(new Student(random.nextInt(1000)+"","Mike"));
        studentList.add(new Student(random.nextInt(1000)+"","Amy"));
        studentList.add(new Student(random.nextInt(1000)+"","Lucy"));
        studentList.add(new Student(1000+"","Beyone"));
        System.out.println("----排序前----:");
        for (Student student : studentList) {
            System.out.println(student.id+","+student.name);
        }
        System.out.println();
        System.out.println("---- 排序后----");
        Collections.sort(studentList);
        for (Student student : studentList) {
            System.out.println(student.id+","+student.name);
        }
        Collections.sort(studentList, new StudentComparactor());
        System.out.println("----按照姓名排序----");
        for (Student student : studentList) {
            System.out.println(student.id+","+student.name);
        }
    }

 

posted @ 2018-02-06 21:12  helloWorldhelloWorld  阅读(121)  评论(0)    收藏  举报