JAVA开发之旅(十四)###集合(3)###

本文深入讲解了集合的基本操作,包括如何判断集合中是否包含特定元素、如何获取元素在List中的位置、如何判断Map中是否包含指定的key或value,以及如何使用Collection.sort进行排序,并介绍了Comparable与Comparator接口的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###集合(3)###

 

1. 如何判断几何中是否包含某个元素

    contains方法:

    //contains方法
    public void testListContains(){
        //取得备选课程序列的第0个元素
        Course course = coursesToSelect.get(0);
        //打印输出coursesToSelected是否包含course对象
        System.out.println("取得课程:"+course.getName());
        System.out.println("备选课程中是否包含:"+course.getName()+","+
        coursesToSelect.contains(course));
    }
    public static void main(String[] args) {

        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
    }

    public void testListContains(){
        //取得备选课程序列的第0个元素
        Course course = coursesToSelect.get(0);
        //打印输出coursesToSelected是否包含course对象
        System.out.println("取得课程:"+course.getName());
        System.out.println("备选课程中是否包含:"+course.getName()+","+
        coursesToSelect.contains(course));
        //创建一个新的课程对象,ID和名称,与course对象一样
        Course course2 = new Course(course.getId(),course.getName());
        System.out.println("新创建课程:"+ course2.getName());
        System.out.println("备选课程中是否包含:"+course2.getName()+","+
                coursesToSelect.contains(course2));
    }
    public static void main(String[] args) {

        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
    }

虽然两个course内容ID一样 但是还是为同一个对象,所以第二次为false。

contains详细图解:

例:此时增加方法:

    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.getName() == null) {
            if (course.getName() == null) {
                return true;
            } else {
                return false;
            }
        } else {
            if (this.getName().equals(course.name)) {
                return true;
            }else {
                return false;
            }
        }
    }
    public static void main(String[] args) {

        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
    }

此时可以看到course2中也显示true了。

例:重新加入Scanner键盘录入查询后:

public class SetTest {

    public List<Course> coursesToSelect;

    private Scanner console;

    public SetTest() {
        coursesToSelect = new ArrayList<Course>();
        console = new Scanner(System.in);
}
    //contains方法
    public void testListContains(){
        //取得备选课程序列的第0个元素
        Course course = coursesToSelect.get(0);
        //打印输出coursesToSelected是否包含course对象
        System.out.println("取得课程:"+course.getName());
        System.out.println("备选课程中是否包含:"+course.getName()+","+
        coursesToSelect.contains(course));
        //提示输入课程名称
        System.out.println("请输入课程名称:");
        String name = console.next();
        //创建一个新的课程对象,ID和名称,与course对象一样
        Course course2 = new Course();
        course2.setName(name);
        System.out.println("新创建课程:"+ course2.getName());
        System.out.println("备选课程中是否包含:"+course2.getName()+","+
                coursesToSelect.contains(course2));
    }
    public static void main(String[] args) {

        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
    }

 

2. Set中判断是否存在

   Conllection:

                   Set:contains、containsAll

import java.util.Objects;

public class Course {
    private String id;
    private String name;

    public Course(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public Course() {
    }

    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;
    }

    @Override
    public int hashCode() {

        return Objects.hash(name);
    }

    @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.getName() == null) {
            if (course.getName() == null) {
                return true;
            } else {
                return false;
            }
        } else {
            if (this.getName().equals(course.name)) {
                return true;
            }else {
                return false;
            }
        }
    }
}
    //创建学生对象并选课
    public void createStuAndSelC(){
        //创建学生对象
        student = new Student("1","小明");
        System.out.println("欢迎"+student.getName()+"进入选课系统");
        //接收从键盘输入的课程ID
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i<3;i++){
            System.out.println("请输入要选课程ID");
            String cId = sc.next();
            for(Course cr : coursesToSelect){
                if(cr.getId().equals(cId)){
                    student.course.add(cr);
                }
            }
        }
    }
    public void testSetContains(){
        //提示输入课程名称
        System.out.println("请输入学生已选的课程名称:");
        String name = console.next();
        Course course2 = new Course();
        course2.setName(name);
        System.out.println("新创建课程:"+ course2.getName());
        System.out.println("备选课程中是否包含:"+course2.getName()+","+
                student.course.contains(course2));
    }
    public static void main(String[] args) {

        SetTest st = new SetTest();
        st.testAdd();
        st.testForEach();
        st.createStuAndSelC();
        st.testSetContains();
    }

 

3. 获取List中的课程的位置:indexOf方法来取得某元素的索引位置

    //contains方法
    public void testListContains() {
        //取得备选课程序列的第0个元素
        Course course = coursesToSelect.get(0);
        //打印输出coursesToSelected是否包含course对象
        System.out.println("取得课程:" + course.getName());
        System.out.println("备选课程中是否包含:" + course.getName() + "," +
                coursesToSelect.contains(course));
        //提示输入课程名称
        System.out.println("请输入课程名称:");
        String name = console.next();
        //创建一个新的课程对象,ID和名称,与course对象一样
        Course course2 = new Course();
        course2.setName(name);
        System.out.println("新创建课程:" + course2.getName());
        System.out.println("备选课程中是否包含:" + course2.getName() + "," +
                coursesToSelect.contains(course2));
        //通过indexOf方法来取得某元素的索引位置
        if (coursesToSelect.contains(course2)) {
            System.out.println("课程:" + course2.getName() + "的索引位置为:"
                    + coursesToSelect.indexOf(course2));
        }
    }

 

    public static void main(String[] args) {

        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
        st.testForEach();
        //st.testForEachForSet(student);
        //st.createStuAndSelC();
        //st.testSetContains();
    }

 

 

4. 判断Map中是否包含指定的key和value

  1)通过Key查找

public class MapTest {
    public Map<String, Student> students;

    public MapTest() {
        this.students = new HashMap<String, Student>();
    }

    public void testKeySet() {
        //通过keySet方法,返回Map中的所有“键”的Set集合
        Set<String> keySet = students.keySet();
        //取得students的容量
        System.out.println("共有:" + students.size() + "个学生");
        for (String sID : keySet) {
            Student st = students.get(sID);
            if (st != null) {
                System.out.println("学生:" + st.getName());
            }
        }
    }

    public void testPut() {
        Scanner sc = new Scanner(System.in);
        int i = 0;
        while (i < 3) {
            System.out.println("请输入学生ID:");
            String ID = sc.next();
            Student st = students.get(ID);
            if (st == null) {
                System.out.println("请输入学生姓名:");
                String name = sc.next();
                Student nSt = new Student(ID, name);
                students.put(ID, nSt);
                System.out.println("成功添加:" + students.get(ID).getName());
                i++;
            } else {
                System.out.println("学生ID被占用");
                continue;
            }
        }
    }

    //删除测试
    public void testRemove() {
        System.out.println("请输入要删除的学生ID:");
        while(true){
            Scanner sc = new Scanner(System.in);
            String ID = sc.next();
            Student st = students.get(ID);
            if (st == null){
                System.out.println("您输入的ID不存在");
                continue;
            }
            students.remove(ID);
            System.out.println("成功删除学生"+st.getName());
            break;
        }
    }
    //通过entrySet来遍历Map
    public void testEntrySet(){
        Set<Map.Entry<String,Student>> entrySet = students.entrySet();
        for (Map.Entry<String,Student> entry : entrySet){
            System.out.println("取得键:"+entry.getKey());
            System.out.println("对应的学生为:"+entry.getValue().getName());
        }
    }

    //利用put方法修改Map中的已有映射
    public void testModify(){
        System.out.println("请输入要修改的学生ID");
        Scanner sc = new Scanner(System.in);
        while(true){
            String stuID = sc.next();
            //查找是否又相应的映射
            Student student = students.get(stuID);
            if(student ==null){
                System.out.println("学生ID不存在,请重新输入");
                continue;
            }
            System.out.println("该学生ID,所对应的学生为:"+student.getName());
            System.out.println("请输入新的学生姓名");
            String name = sc.next();
            Student nStu =new Student(stuID,name);
            students.put(stuID,nStu);
            System.out.println("修改成功!");
            break;
        }
    }

    //测试Map中,是否包含某个Key值或者某个Value值
    public void testContainKorV(){
        //提示输入学生ID
        System.out.println("请输入学生ID:");
        Scanner sc = new Scanner(System.in);
        String id = sc.next();
        //在Map中,用containsKey()方法,来判断是否包含某个Key值
        System.out.println("您输入的学生ID为:"+id+",在学生映射表中是否存在:"+
        students.containsKey(id));
        if(students.containsKey(id)){
            System.out.println("对应的学生为:"+students.get(id).getName());
        }
        //用containsValue()方法,来判断是否包含某个Value值

    }
}
    public static void main(String[] args) {
        MapTest mt = new MapTest();
        mt.testPut();
        mt.testKeySet();
        mt.testContainKorV();
    }

  2)通过Value查找

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

public class Student {
    private String id;
    private String name;
    public Set<Course> course;

    public Student() {
    }

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

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name);
    }
}
    //测试Map中,是否包含某个Key值或者某个Value值
    public void testContainKorV(){
        //提示输入学生ID
        System.out.println("请输入学生ID:");
        Scanner sc = new Scanner(System.in);
        String id = sc.next();
        //在Map中,用containsKey()方法,来判断是否包含某个Key值
        System.out.println("您输入的学生ID为:"+id+",在学生映射表中是否存在:"+
        students.containsKey(id));
        if(students.containsKey(id)){
            System.out.println("对应的学生为:"+students.get(id).getName());
        }
        System.out.println("请输入要查询的学生姓名:");
        String name = sc.next();
        //用containsValue()方法,来判断是否包含某个Value值
        if(students.containsValue(new Student(null,name))){
            System.out.println("在学生映射表中,确实包含学生:"+name);
        }else{
            System.out.println("在学生映射表中不存在该学生");
        }
    }
    public static void main(String[] args) {
        MapTest mt = new MapTest();
        mt.testPut();
        mt.testKeySet();
        mt.testContainKorV();
    }

 

5. Collection.sort{}实现list排序:是Java集合框架中,用来操作集合对象的工具类,同时也是Java集合框架的成员

  sout()(排序)方法:

 

例1:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class CollectionsTest {

    public void testSort1(){
        List<Integer> integerList = new ArrayList<Integer>();
        //不能使用基本类型作为泛型
        //插入是个100以内的不重复随机整数
        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.println("元素:"+integer);
        }
        Collections.sort(integerList);
        System.out.println("---------排序后--------");
        for (Integer integer:integerList) {
            System.out.println("元素:"+integer);
        }
    }
}
    public static void main(String[] args) {

        CollectionsTest ct = new CollectionsTest();
        ct.testSort1();
    }

 

例2:

    //对String泛型的List进行排序
    public void testSort2(){
        List<String> stringList = new ArrayList<String>();
        stringList.add("Silvia");
        stringList.add("Angelababy");
        stringList.add("Emma");
        System.out.println("---------排序前-------");
        for (String string:stringList){
            System.out.println("元素:"+string);
        }
        Collections.sort(stringList);
        System.out.println("---------排序后-------");
        for (String string:stringList){
            System.out.println("元素:"+string);
        }
    }
    public static void main(String[] args) {

        CollectionsTest ct = new CollectionsTest();
        //ct.testSort1();
        ct.testSort2();
    }

 

补:尝试用对其他泛型的List进行排序

    //对其他类型的泛型的List进行排序
    public void testSort3() {
        List<Student> studentList = new ArrayList<Student>();
        studentList.add(new Student(1+"","梦竹"));
        studentList.add(new Student(2+"","帜琦"));
        studentList.add(new Student(3+"","杨颖"));
        System.out.println("---------排序前-------");
        for (Student student:studentList) {
            System.out.println("学生:"+student.getName());
        }
        Collections.sort(studentList);
    }

 

6. Comparable 与 Comparator

  1)Comparable接口:对于Object1 与 Object2 进行比较---必须有可比较的属性,此时Comparable给予对象比较规则。

      实现该接口表示:这个类的实例可以比较大小,可以进行自然排序

      定义了默认的比较规则

      其实现类需实现comparaTo()方法

      comparaTo()方法返回正数表示大,负数表示小,0表示相等

  2)Comparetor接口:定义临时的比较规则

      用于定义临时比较规则,而不是默认比较规则

      其实现类需要实现compara()方法

      Comparator 和 Comparable 都是Java集合框架成员

 

例:

1)自然排序

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

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

    public Student() {
    }

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

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name);
    }

    @Override
    public int compareTo(Student o) {
        return this.id.compareTo(o.id);
    }
}
//对其他类型的泛型的List进行排序
    public void testSort3() {
        List<Student> studentList = new ArrayList<Student>();
        Random random = new Random();
        studentList.add(new Student(random.nextInt(100)+"","AndrewL"));
        studentList.add(new Student(random.nextInt(100)+"","Silvia"));
        studentList.add(new Student(random.nextInt(100)+"","Angelababy"));
        System.out.println("---------排序前-------");
        for (Student student:studentList) {
            System.out.println("学生:"+student.getId()+student.getName());
        }
        Collections.sort(studentList);
        System.out.println("---------排序后-------");
        for (Student student:studentList) {
            System.out.println("学生:"+student.getId()+student.getName());
        }
    }
    public static void main(String[] args) {

        CollectionsTest ct = new CollectionsTest();
        ct.testSort3();
    }

排序方式:

 

2)比较排序

ps:可以将Comparator传递给sort方法(如Collections.sort 或 Arrays.sort)

import java.util.Comparator;

public class StudentComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getName().compareTo(o2.getName());
    }
}
    //对其他类型的泛型的List进行排序
    public void testSort3() {
        List<Student> studentList = new ArrayList<Student>();
        Random random = new Random();
        studentList.add(new Student(random.nextInt(100)+"","AndrewL"));
        studentList.add(new Student(random.nextInt(100)+"","Silvia"));
        studentList.add(new Student(random.nextInt(100)+"","Angelababy"));
        System.out.println("---------排序前-------");
        for (Student student:studentList) {
            System.out.println("学生:"+student.getId()+student.getName());
        }
        Collections.sort(studentList);
        System.out.println("---------排序后-------");
        for (Student student:studentList) {
            System.out.println("学生:"+student.getId()+student.getName());
        }
        Collections.sort(studentList,new StudentComparator());
        System.out.println("--------姓名排序------");
        for (Student student:studentList) {
            System.out.println("学生:"+student.getId()+student.getName());
        }
    }
    public static void main(String[] args) {

        CollectionsTest ct = new CollectionsTest();
        ct.testSort3();
    }

 

总结:

 

 

7. 例题简易扑克牌游戏

package ddz;

import java.util.ArrayList;
import java.util.Collections;

public class 斗地主 {
    public static void main(String[] args) {

        //创建牌盒子
        ArrayList<String> pokerList = new ArrayList<>();
        //生成54张牌放进牌盒子中
        String[] colors = {"♥", "♠", "♣", "♦"};
        String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        for (String color : colors) {
            for (String num : nums) {
                pokerList.add(color.concat(num));
            }
        }
        //手动添加大小王
        pokerList.add("☀");
        pokerList.add("
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值