ArrayList類

瑪拉_以琳發表於2018-09-04

1.ArrayList

集合和陣列的優勢對比:

  1. 長度可變
  2. 新增資料的時候不需要考慮索引,預設將資料新增到末尾

1.1 ArrayList類概述

  • 什麼是集合

    ​ 提供一種儲存空間可變的儲存模型,儲存的資料容量可以發生改變

  • ArrayList集合的特點

    ​ 長度可以變化,只能儲存引用資料型別。

  • 泛型的使用

    ​ 用於約束集合中儲存元素的資料型別

1.2 ArrayList類常用方法

1.2.1 構造方法

方法名說明
public ArrayList()建立一個空的集合物件

1.2.2 成員方法

方法名說明
public boolean add(要新增的元素)將指定的元素追加到此集合的末尾
public boolean remove(要刪除的元素)刪除指定元素,返回值表示是否刪除成功
public E remove(int index)刪除指定索引處的元素,返回被刪除的元素
public E set(int index,E element)修改指定索引處的元素,返回被修改的元素
public E get(int index)返回指定索引處的元素
public int size()返回集合中的元素的個數

1.2.3 示例程式碼

public class ArrayListDemo02 {
    public static void main(String[] args) {
        //建立集合
        ArrayList<String> array = new ArrayList<String>();

        //新增元素
        array.add("hello");
        array.add("world");
        array.add("java");

        //public boolean remove(Object o):刪除指定的元素,返回刪除是否成功
        //        System.out.println(array.remove("world"));
        //        System.out.println(array.remove("javaee"));

        //public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
        //        System.out.println(array.remove(1));

        //IndexOutOfBoundsException
        //        System.out.println(array.remove(3));

        //public E set(int index,E element):修改指定索引處的元素,返回被修改的元素
        //        System.out.println(array.set(1,"javaee"));

        //IndexOutOfBoundsException
        //        System.out.println(array.set(3,"javaee"));

        //public E get(int index):返回指定索引處的元素
        //        System.out.println(array.get(0));
        //        System.out.println(array.get(1));
        //        System.out.println(array.get(2));
        //System.out.println(array.get(3)); //?????? 自己測試

        //public int size():返回集合中的元素的個數
        System.out.println(array.size());

        //輸出集合
        System.out.println("array:" + array);
    }
}

1.3 ArrayList儲存字串並遍歷

1.3.1 案例需求

​ 建立一個儲存字串的集合,儲存3個字串元素,使用程式實現在控制檯遍歷該集合

1.3.2 程式碼實現

public class ArrayListDemo3 {
    public static void main(String[] args) {
        //1.建立集合物件
        ArrayList<String> list = new ArrayList<>();

        //2.新增元素
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");

        //3.遍歷
        //快捷鍵: list.fori 正向遍歷
        //list.forr 倒著遍歷
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            //i 依次表示集合裡面的每一個索引

            if(i == list.size() - 1){
                //最大索引
                System.out.print(list.get(i));
            }else{
                //非最大索引
                System.out.print(list.get(i) + ", ");
            }
        }
        System.out.print("]");
    }
}

1.4 ArrayList儲存學生物件並遍歷

1.4.1 案例需求

​ 建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合

1.4.2 程式碼實現

public class ArrayListDemo4 {
    public static void main(String[] args) {
        //1.建立集合物件,用來儲存資料
        ArrayList<Student> list = new ArrayList<>();

        //2.建立學生物件
        Student s1 = new Student("zhangsan",16);
        Student s2 = new Student("lisi",15);
        Student s3 = new Student("wangwu",18);

        //3.把學生物件新增到集合中
        list.add(s1);
        list.add(s2);
        list.add(s3);

        //4.遍歷
        for (int i = 0; i < list.size(); i++) {
            //i 依次表示集合中的每一個索引
            Student stu = list.get(i);
            System.out.println(stu.getName() + ", " + stu.getAge());
        }



    }
}

1.5 查詢使用者的索引

需求:

1,main方法中定義一個集合,存入三個使用者物件。

使用者屬性為:id,username,password

2,要求:定義一個方法,根據id查詢對應的學生資訊。

如果存在,返回索引

如果不存在,返回-1

程式碼示例:

public class ArrayListDemo6 {
    public static void main(String[] args) {
        /*需求:
        1,main方法中定義一個集合,存入三個使用者物件。
        使用者屬性為:id,username,password
        2,要求:定義一個方法,根據id查詢對應的學生資訊。
        如果存在,返回索引
        如果不存在,返回-1*/


        //1.建立集合物件
        ArrayList<User> list = new ArrayList<>();

        //2.建立使用者物件
        User u1 = new User("001", "zhangsan", "123456");
        User u2 = new User("002", "lisi", "1234");
        User u3 = new User("003", "wangwu", "1234qwer");

        //3.把使用者物件新增到集合當中
        list.add(u1);
        list.add(u2);
        list.add(u3);

        //4.呼叫方法,透過id獲取對應的索引
        int index = getIndex(list, "001");

        System.out.println(index);

    }


    //1.我要幹嘛?  根據id查詢對應的學生資訊
    //2.我幹這件事情需要什麼才能完成?   集合 id
    //3.方法的呼叫處是否需要繼續使用方法的結果?
    //要用必須返回,不要用可以返回也可以不返回
    //明確說明需要有返回值 int
    public static int getIndex(ArrayList<User> list, String id) {
        //遍歷集合得到每一個元素
        for (int i = 0; i < list.size(); i++) {
            User u = list.get(i);
            String uid = u.getId();
            if(uid.equals(id)){
                return i;
            }
        }
        //因為只有當集合裡面所有的元素都比較完了,才能斷定id是不存在的。
        return -1;
    }
}

1.6 判斷使用者的是否存在

public class ArrayListDemo5 {
    public static void main(String[] args) {
       /* 需求:
        1,main方法中定義一個集合,存入三個使用者物件。
        使用者屬性為:id,username,password
        2,要求:定義一個方法,根據id查詢對應的學生資訊。
        如果存在,返回true
        如果不存在,返回false*/

        //1.定義集合
        ArrayList<User> list = new ArrayList<>();

        //2.建立物件
        User u1 = new User("001","zhangsan","123456");
        User u2 = new User("002","lisi","12345678");
        User u3 = new User("003","wangwu","1234qwer");

        //3.把使用者物件新增到集合當中
        list.add(u1);
        list.add(u2);
        list.add(u3);

        //4.呼叫方法,查詢id是否存在
        boolean result = contains(list, "001");
        System.out.println(result);

    }

    //定義在測試類中的方法需要加static
    //1.我要幹嘛? 我要根據id查詢學生是否存在
    //2.我幹這件事情,需要什麼才能完成? 集合 id
    //3.方法的呼叫處是否需要使用方法的結果?
    //如果要用,必須返回,如果不用,可以返回也可以不返回
    //但是本題明確說明需要返回
    public static boolean contains(ArrayList<User> list, String id){
        //迴圈遍歷集合,得到集合裡面的每一個元素
        //再進行判斷

        for (int i = 0; i < list.size(); i++) {
            //i 索引  list.get(i); 元素
            User u = list.get(i);
            //判斷id是否存在,我是拿著誰跟誰比較
            //需要把使用者物件裡面的id拿出來再進行比較。
            String uid = u.getId();
            if(id.equals(uid)){
                return true;//return 關鍵字:作用就是結束方法。
            }
        }
        //只有當集合裡面所有的元素全部比較完畢才能認為是不存在的。
        return false;
    }

}

2.學生管理系統

2.1學生管理系統實現步驟

  • 案例需求

    ​ 針對目前我們的所學內容,完成一個綜合案例:學生管理系統。該系統主要功能如下:

    ​ 新增學生:透過鍵盤錄入學生資訊,新增到集合中

    ​ 刪除學生:透過鍵盤錄入要刪除學生的學號,將該學生物件從集合中刪除

    ​ 修改學生:透過鍵盤錄入要修改學生的學號,將該學生物件其他資訊進行修改

    ​ 檢視學生:將集合中的學生物件資訊進行展示

    ​ 退出系統:結束程式

  • 實現步驟

    1. 定義學生類,包含以下成員變數

      ​ private String sid // 學生id

      ​ private String name // 學生姓名

      ​ private String age // 學生年齡

      ​ private String address // 學生所在地

    2. 學生管理系統主介面的搭建步驟

      2.1 用輸出語句完成主介面的編寫
      2.2 用Scanner實現鍵盤輸入
      2.3 用switch語句完成選擇的功能
      2.4 用迴圈完成功能結束後再次回到主介面

    3. 學生管理系統的新增學生功能實現步驟

      3.1 定義一個方法,接收ArrayList<Student>集合
      3.2 方法內完成新增學生的功能
      ​ ①鍵盤錄入學生資訊
      ​ ②根據錄入的資訊建立學生物件
      ​ ③將學生物件新增到集合中
      ​ ④提示新增成功資訊
      3.3 在新增學生的選項裡呼叫新增學生的方法

    4. 學生管理系統的檢視學生功能實現步驟

      4.1 定義一個方法,接收ArrayList<Student>集合
      4.2 方法內遍歷集合,將學生資訊進行輸出
      4.3 在檢視所有學生選項裡呼叫檢視學生方法

    5. 學生管理系統的刪除學生功能實現步驟

      5.1 定義一個方法,接收ArrayList<Student>集合
      5.2 方法中接收要刪除學生的學號
      5.3 遍歷集合,獲取每個學生物件
      5.4 使用學生物件的學號和錄入的要刪除的學號進行比較,如果相同,則將當前學生物件從集合中刪除
      5.5 在刪除學生選項裡呼叫刪除學生的方法

    6. 學生管理系統的修改學生功能實現步驟

      6.1 定義一個方法,接收ArrayList<Student>集合
      6.2 方法中接收要修改學生的學號
      6.3 透過鍵盤錄入學生物件所需的資訊,並建立物件
      6.4 遍歷集合,獲取每一個學生物件。並和錄入的修改學生學號進行比較.如果相同,則使用新學生物件替換當前學生物件
      6.5 在修改學生選項裡呼叫修改學生的方法

    7. 退出系統

      使用System.exit(0);退出JVM

2.2學生類的定義

public class Student {
    private String id;
    private String name;
    private int age;
    private String address;

     //下面是空參,有參,get和set方法
}

2.3測試類的定義

public class StudentSystem {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        loop:
        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:退出");
            System.out.println("請輸入您的選擇:");
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();
            switch (choose) {
                case "1" -> addStudent(list);
                case "2" -> deleteStudent(list);
                case "3" -> updateStudent(list);
                case "4" -> queryStudent(list);
                case "5" -> {
                    System.out.println("退出");
                    //break loop;
                    System.exit(0);//停止虛擬機器執行
                }
                default -> System.out.println("沒有這個選項");
            }
        }
    }

    //新增學生
    public static void addStudent(ArrayList<Student> list) {
        //利用空參構造先建立學生物件
        Student s = new Student();

        Scanner sc = new Scanner(System.in);
        String id = null;
        while (true) {
            System.out.println("請輸入學生的id");
            id = sc.next();
            boolean flag = contains(list, id);
            if(flag){
                //表示id已經存在,需要重新錄入
                System.out.println("id已經存在,請重新錄入");
            }else{
                //表示id不存在,表示可以使用
                s.setId(id);
                break;
            }
        }

        System.out.println("請輸入學生的姓名");
        String name = sc.next();
        s.setName(name);

        System.out.println("請輸入學生的年齡");
        int age = sc.nextInt();
        s.setAge(age);

        System.out.println("請輸入學生的家庭住址");
        String address = sc.next();
        s.setAddress(address);


        //把學生物件新增到集合當中
        list.add(s);

        //提示一下使用者
        System.out.println("學生資訊新增成功");
    }

    //刪除學生
    public static void deleteStudent(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入要刪除的id");
        String id = sc.next();
        //查詢id在集合中的索引
        int index = getIndex(list, id);
        //對index進行判斷
        //如果-1,就表示不存在,結束方法,回到初始選單
        if(index >= 0){
            //如果大於等於0的,表示存在,直接刪除
            list.remove(index);
            System.out.println("id為:" + id + "的學生刪除成功");
        }else{
            System.out.println("id不存在,刪除失敗");
        }
    }

    //修改學生
    public static void updateStudent(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入要修改學生的id");
        String id = sc.next();

        int index = getIndex(list, id);

        if(index == -1){
            System.out.println("要修改的id" + id + "不存在,請重新輸入");
            return;
        }

        //當程式碼執行到這裡,表示什麼?表示當前id是存在的。
        //獲取要修改的學生物件
        Student stu = list.get(index);

        //輸入其他的資訊並修改
        System.out.println("請輸入要修改的學生姓名");
        String newName = sc.next();
        stu.setName(newName);

        System.out.println("請輸入要修改的學生年齡");
        int newAge = sc.nextInt();
        stu.setAge(newAge);

        System.out.println("請輸入要修改的學生家庭住址");
        String newAddress = sc.next();
        stu.setAddress(newAddress);

        System.out.println("學生資訊修改成功");


    }


    //查詢學生
    public static void queryStudent(ArrayList<Student> list) {
        if (list.size() == 0) {
            System.out.println("當前無學生資訊,請新增後再查詢");
            //結束方法
            return;
        }

        //列印表頭資訊
        System.out.println("id\t\t姓名\t年齡\t家庭住址");
        //當程式碼執行到這裡,表示集合中是有資料的
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t" + stu.getAddress());
        }
    }


    //判斷id在集合中是否存在
    public static boolean contains(ArrayList<Student> list, String id) {
        //迴圈遍歷集合得到裡面的每一個學生物件
        /*for (int i = 0; i < list.size(); i++) {
            //拿到學生物件後,獲取id並進行判斷
            Student stu = list.get(i);
            String sid = stu.getId();
            if(sid.equals(id)){
                //存在,true
                return true;
            }
        }
        // 不存在false
        return false;*/
       return getIndex(list,id) >= 0;
    }

    //透過id獲取索引的方法
    public static int getIndex(ArrayList<Student> list, String id){
        //遍歷集合
        for (int i = 0; i < list.size(); i++) {
            //得到每一個學生物件
            Student stu = list.get(i);
            //得到每一個學生物件的id
            String sid = stu.getId();
            //拿著集合中的學生id跟要查詢的id進行比較
            if(sid.equals(id)){
                //如果一樣,那麼就返回索引
                return i;
            }
        }
        //當迴圈結束之後還沒有找到,就表示不存在,返回-1.
        return -1;
    }
}

相關文章