遍历数组remove某些元素

原来的要求:

对一个数组遍历,移除某些元素,输出最后包含需要的元素的数组;

一、错误做法

public static void main(String[] args) {
        ArrayList<String> studentName = new ArrayList<>();
        studentName.add("1");
        studentName.add("2");
        studentName.add("3");
        studentName.add("4");
        studentName.add("5");
        for (int i = 0; i < studentName.size(); i++) {
        	System.out.println("i:"+i);
            String name= studentName.get(i);
            Boolean ifFk = checkFk(name);
            if (ifFk){
                studentName.remove(name);
            }
        }
        System.out.println(studentName);
    }

    private static Boolean checkFk(String name) {
        if (name.equals("2") || name.equals("5") || name.equals("4")){
            return true;
        }
        return false;
    }

过程:

i     元素   是否移除        结果                       列表大小
0      1       否        [1,2,3,4,5]                     5
1      2       是        [1,3,4,5]                       4
2      4       是         [1,3,5]                        3

结果:

i:0
i:1
i:2
[1, 3, 5]

说明:

因为i

二、正确做法

 public static void main(String[] args) {
        ArrayList<String> studentName= new ArrayList<>();
        studentName.add("1");
        studentName.add("2");
        studentName.add("3");
        studentName.add("4");
        studentName.add("5");
        for (int i = studentName.size()-1; i >= 0; i--) {
        	System.out.println("i:"+i);
            String name= studentName.get(i);
            Boolean ifFk = checkFk(name);
            if (ifFk){
                studentName.remove(name);
            }
        }
        System.out.println(studentName);
    }

    private static Boolean checkFk(String name) {
        if (name.equals("2") || name.equals("5") || name.equals("4")){
            return true;
        }
        return false;
    }

过程:

i   元素   是否移除        结果                       
4   5         是       [1,2,3,4]                          
3   4         是        [1,2,3]                             
2   3         否        [1,2,3]                             
1   2         是         [1,3]                                
0   1         否         [1,3]             

结果:

i:4
i:3
i:2
i:1
i:0
[1, 3]

倒序遍历,只要i>=0

三、其他做法

public static void main(String[] args) {
        ArrayList<String> studentName= new ArrayList<>();
        studentName.add("1");
        studentName.add("2");
        studentName.add("3");
        studentName.add("4");
        studentName.add("5");
        List<String> studentNameNew= studentName;
        for (int i = 0; i < studentNameNew.size(); i++) {
            String name= studentNameNew.get(i);
            Boolean ifFk = checkFk(name);
            if (ifFk){
                studentName.remove(name);
            }
        }

        System.out.println(studentNameNew);
        System.out.println(studentName);
    }

    private static Boolean checkFk(String name) {
        if (name.equals("2") || name.equals("5") || name.equals("4")){
            return true;
        }
        return false;
    }

本来的想法:

既然studentName会发生变化,那我搞一个studentNameNew作为遍历的数组,这样就可以了吧?

结果:

[1, 3, 5]
[1, 3, 5]

说明:

studentNameNew也发生了变化,因为List属于引用类型的变量。当我们把studentName赋值给studentNameNew时,实际上赋予的并不是变量的值,而是变量的地址,程序执行过程中,这两个变量指向同一个地址,数组元素变化即两个变量的值变化!

Java引用类型是一种数据类型,用于存储引用地址而不是实际的值。在Java中,引用类型包括类、接口、数组和枚举。
常用的引用类型有:字符串、数组、集合

这时候二的倒序遍历可以作用到每一个元素,下面一段代码也可以理解:

int i = studentName.size()-1

因为 i 是int类型(基本数据类型),尽管后续程序的执行导致studentName的大小发生了变化,但是变量 i 的值始终是数组studentName最初的大小-1的(即4)

你可能感兴趣的:(学习,java)