原来的要求:
对一个数组遍历,移除某些元素,输出最后包含需要的元素的数组;
一、错误做法
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<studentName.size()的条件不成立,循环结束,元素5并没有被移除,列表的每个元素也没有被遍历。
二、正确做法
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中,引用类型包括类、接口、数组和枚举。
常用的引用类型有:字符串、数组、集合
这时候二的倒序遍历可以作用到每一个元素,下面一段代码也可以理解:文章来源:https://www.toymoban.com/news/detail-683991.html
int i = studentName.size()-1
因为 i 是int类型(基本数据类型),尽管后续程序的执行导致studentName的大小发生了变化,但是变量 i 的值始终是数组studentName最初的大小-1的值(即4)文章来源地址https://www.toymoban.com/news/detail-683991.html
到了这里,关于遍历数组remove某些元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!