集合基础(黑马就业)

第一部分:ArrayList集合

集合和数组的区别

  • 1.使用对象数组存储并输出对象

  • domain类

package com.domin;
//Student的domain类
public class Student {
    private String name;
    private int age;
    private String sex;

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return sex
     */
    public String getSex() {
        return sex;
    }

    /**
     * 设置
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + ", sex = " + sex + "}";
    }
}

  • 测试类
package com.domin.OOP;

import com.domin.Student;

public class TestObjectArray {
    public static void main(String[] args) {
       //定义一个Student对象数组
        Student [] students = new Student[3];
       Student s1 = new Student("张三",12,"男");
       Student s2 = new Student("李四",12,"男");
       Student s3 = new Student("王五",12,"男");
       students[0] = s1;//引用传递
       students[1] = s2;//引用传递
       students[2] = s3;//引用传递
       //遍历数组
       for (int i = 0; i < students.length; i++) {
           System.out.println(students[i].getName());
           System.out.println(students[i].getAge());
           System.out.println(students[i].getSex());
       }


    }
}



如果存储的数据长度经常发生改变,推荐使用集合

ArrayList集合的构造方法和添加方法

ArrayList的容量可变,底层也是通过数组来完成的

  • 一段示例代码
package com.domin.OOP;

import java.util.ArrayList;

public class ArrayListTest {
    public static void main(String[] args) {
        //1.空参构造创建一个容量为10的空列表
        ArrayList list = new ArrayList();
        //2.添加数据
        list.add("hello");
        list.add(1);
        list.add(false);
        System.out.print(list.toString());

    }
}


可以看出集合中可以添加不同数据类型的数据,但是这样不太好。这里可以添加成功其实是泛型类型没有写,默认使用Object接收,但是这样可能会导致泛型错误

可以通过添加泛型来控制集合中添加数据的类型


主要有2种:(E e)将任意元素添加到尾部,(int index,E element)添加到指定的索引位置

  • 总结

ArrayList常见成员方法(增删改查)

package com.domin.OOP;

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

public class ArrayListTest {
    public static void main(String[] args) {
       //ArrayList集合的增删改查操作
        //1.原始数据
        ArrayList<String> list = new ArrayList<String>();
        Collections.addAll(list,"aaa","bbb","ccc","ddd");
        System.out.println(list);//[aaa, bbb, ccc, ddd]
        //2.删除:boolean remove(Object o)根据元素删除
        final boolean flag = list.remove("aaa");
        System.out.println(list);//[bbb, ccc, ddd]
        //根据索引进行删除(返回被删除的元素)
        final String remove = list.remove(0);
        System.out.println(remove);//bbb
        System.out.println(list);//[ccc, ddd]
        //3.修改元素(根据索引修改)返回被修改的元素
        final String eee = list.set(0, "eee");
        System.out.println(eee);//ccc
        System.out.println(list);//[eee, ddd]
        //4.get(int index)返回指定索引的元素
        final String s = list.get(0);
        System.out.println(s);//eee
        //5.size返回集合中元素的个数
        final int size = list.size();
        System.out.println(size);//2
    }
}

刚刚演示的方法中大多都有返回值,但是在实际的运用中一般都不进行接收

案例:存储字符串并遍历

集合对象.fori,idea可以快捷便利集合

package com.domin.OOP;

import java.util.ArrayList;

public class ArrayListTraverse {
    public static void main(String[] args) {
        //1.创建ArrayList集合对象
        ArrayList<String> list = new ArrayList<String>();
        //2.往集合中添加字符串
        list.add("aaa");
        list.add("bbb");
         list.add("ccc");
         //3.遍历集合
        for (int i = 0; i < list.size(); i++) {
            //使用get方法获取集合中的元素
            final String s = list.get(i);
            System.out.println(s);
        }
        System.out.println(list.size());
        
    }
}

键盘录入学生信息到集合

ctrl+alt+m将选取的内容抽取成方法

package com.domin.OOP;

import com.domin.Student;

import java.util.ArrayList;
import java.util.Scanner;

public class ArrayListTraverse {
    public static void main(String[] args) {
        //1.学生的信息已经定义
        //2.创建集合对象
        ArrayList<Student> list = new ArrayList<Student>();
        //3.键盘录入学生对象需要的信息
        System.out.println("请输入录入的学生的人数:");
        Scanner sc = new Scanner(System.in);
        getStudent(list, sc);
        //4.遍历集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getName());
            System.out.println(list.get(i).getAge());
            System.out.println(list.get(i).getSex());

        }
    }

    private static void getStudent(ArrayList<Student> list, Scanner sc) {
        //将键盘录入的学生信息封装成对象
        final int sum = sc.nextInt();
        for (int i = 0; i < sum; i++) {
            System.out.printf("请输入第%d个学生的姓名:\n", i + 1);
            String name = getString(sc);
            System.out.printf("请输入第%d个学生的年龄:\n", i + 1);
            int age = sc.nextInt();
            System.out.printf("请输入第%d个学生的性别:\n", i + 1);
            String sex = sc.next();
            Student s = new Student(name, age, sex);
            list.add(s);//将对象添加到集合中
        }
    }

    private static String getString(Scanner sc) {
        String name = sc.next();
        return name;
    }
}

案例:删除集合中的元素


目的是删除集合中所有的test,1.通过remove(E e)中的返回值判断是否删除完毕(remove(E e)可以每次删除前面的e元素,循环一直删除即可),2.通过判断元素equals等于test即可删除(使用remove(int index))即可

package com.domin.OOP;

import com.domin.Student;

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

public class ArrayListTraverse {
    public static void main(String[] args) {
       //1.创建集合对象并添加测试数据
        ArrayList<String> list = new ArrayList<String>();
        Collections.addAll(list,"test","张三","李四","test","test");
        System.out.println(list);

        //removeElement(list);
        removeElement1(list);
        //3.遍历集合

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
public static void removeElement1(ArrayList<String> list){
        //(通过remove(int index)
    //通过索引获取元素
    for (int i = 0; i < list.size(); i++) {
        final String s = list.get(i);
        //比较equals
        if("test".equals(s)){
            list.remove(i);
        }

    }
}
    private static void removeElement(ArrayList<String> list) {
        //2.删除集合中所有的test(通过remove(E e))
        for (int i = 0; i < list.size(); i++) {

            final boolean flag = list.remove("test");
            if(!flag){
                System.out.println("删除成功");
                break;
            }
        }
    }


}

但是,当使用索引删除时有时可能会导致最后一个test并没有并删除

  • 对下图代码的分析

    因为在我们删除对应的元素的时候,我们的集合的后面的元素会向前进行填充,而我们的for循环会自动i++。以至于会错过元素
    解决方案是在在删除元素后进行i--即可
public static void removeElement1(ArrayList<String> list){
        //(通过remove(int index)
    //通过索引获取元素
    for (int i = 0; i < list.size(); i++) {
        final String s = list.get(i);
        //比较equals
        if("test".equals(s)){
            list.remove(i);
            i--;
        }

    }
}

案例:集合元素筛选


可以在方法中创建对象然后将引用传递出来,或者直接在main中创建集合

package com.domin.OOP;

import com.domin.Student;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
//集合元素筛选
public class ArrayListTraverse {
    public static void main(String[] args) {
        //1.创建一个集合存储元素
        ArrayList<Student>list = new ArrayList<>();
        Student s1 = new Student("张三",23,"boy");
        Student s2 = new Student("Alex",12,"boy");
        Student s3 = new Student("Jean",18,"girl");
        Student s4 = new Student("Jack",45,"boy");
        Student s5 = new Student("Girl",11,"girl");
        Collections.addAll(list,s1,s2,s3,s4,s5);//添加数据
        //2.创建集合存储过滤得到的数据
        ArrayList<Student>list1 = new ArrayList<>();
        
        filter(list,list1);
        //3.遍历过滤得到的数据
        for (int i = 0; i < list1.size(); i++) {
            System.out.println(list1.get(i));
        }

    }
    //数据过滤
    private static void filter(ArrayList<Student> list,ArrayList<Student>list1) {
        for (int i = 0; i < list.size(); i++) {
            final Student s = list.get(i);
            if(s.getAge()<18){//将小于18岁的对象添加到新的集合中
                list1.add(s);
            }
        }
    }
}

第二部分:学生管理系统


对学号有唯一性的把控



该代码只是对学生管理系统的大致实现,具体的细节没有做过多测试

package com.domin.OOP.StudentManager;

import com.domin.OOP.StudentManager.domain.Student;

import java.util.ArrayList;
import java.util.Scanner;

//学生管理系统的测试类
public class StudentManagerTest {
    //判断学号是否唯一
    public static boolean isUniqueSid(ArrayList<Student> list, String sid) {
        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            final String sid1 = list.get(i).getSid();
            if (sid1.equals(sid)) {
                return true;//学号相等,返回ture
            }

        }
        return false;//遍历到尾不相等
    }
    //主界面方法
    public static void mainView(ArrayList<Student> list) {

        while (true) {
            System.out.println("-------------------欢迎来到学生管理系统--------------");
            System.out.println("1.添加学生");
            System.out.println("2.删除学生");
            System.out.println("3.修改学生");
            System.out.println("4.查看所有学生");
            System.out.println("5.退出");
            Scanner sc =  new Scanner(System.in);
            System.out.println("请输入你的选择:");
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    String tmp= null;//临时存储学号
                    while (true) {
                        System.out.println("请输入添加学生的学号:");
                        tmp = sc.next();
                        if (!(isUniqueSid(list, tmp))) {
                            break;
                        }
                        System.out.println("输入的学号重复,请重新输入!");
                    }
                    String sid = tmp;

                    System.out.println("请输入添加学生的姓名:");
                    String name = sc.next();
                    System.out.println("请输入添加学生的年龄:");
                    int age = sc.nextInt();
                    System.out.println("请输入添加学生的生日:");
                    String birthday = sc.next();
                    //将添加的学生添加到集合中
                    list.add(new Student(sid, name, age, birthday));
                    break;
                case 2:
                    System.out.println("请输入要删除学生的索引:");
                    int index = sc.nextInt();
                    list.remove(index);

                    break;
                case 3:
                    System.out.println("修改学生");
                    //请输入要修改学生的索引
                    System.out.println("请输入要修改学生的索引:");
                    int index1 = sc.nextInt();
                    System.out.println("请输入修改后的学号:");
                    String sid1 = sc.next();
                    System.out.println("请输入修改后i姓名:");
                    String name1 = sc.next();
                    System.out.println("请输入修改后的年龄:");
                    int age1 = sc.nextInt();
                    System.out.println("请输入修改后的生日:");
                    String birthday1 = sc.next();
                    list.set(index1,new Student(sid1,name1,age1,birthday1) );
                    break;
                case 4:
                    //遍历集合
                    for (int i = 0; i < list.size(); i++) {
                        System.out.println(list.get(i));
                    }

                    break;
                case 5:
                    System.out.println("退出");
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入错误");
            }
        }
    }
    public static void main(String[] args) {
        //创建集合存储学生的数据
        ArrayList<Student> list = new ArrayList<>();

       mainView(list);
    }
}

posted @ 2023-06-07 19:15  一往而深,  阅读(6)  评论(0编辑  收藏  举报