image.png

    1. package com.itheima.arraylist;
    2. import java.util.ArrayList;
    3. public class ArrayListTest4 {
    4. public static void main(String[] args) {
    5. // 目标:学习遍历并删除元素的正确方案
    6. // 1.创建一个ArrayList集合存储一个班级学生的成绩
    7. ArrayList<Integer> scores = new ArrayList<>();
    8. scores.add(98);
    9. scores.add(77);
    10. scores.add(66);
    11. scores.add(89);
    12. scores.add(79);
    13. scores.add(50);
    14. scores.add(100);
    15. System.out.println(scores);
    16. // 有毛病的代码
    17. // 2.把分数低于80分的成绩从集合中去掉
    18. // for (int i = 0; i < scores.size(); i++) {
    19. // int score = scores.get(i); // 将每次遍历到的元素赋值给score
    20. // if (score < 80){
    21. // // 这个分数必须删除
    22. // scores.remove(i); // 如果用remove会删除一个元素后,他后面的一个元素会往前移动,索引会发生变化,所以不能用这种方式
    23. // }
    24. // } //[98, 77, 66, 89, 79, 50, 100]原集合
    25. // System.out.println(scores); //[98, 66, 89, 50, 100]
    26. // 完美方案之一:
    27. // for (int i = 0; i < scores.size(); i++) {
    28. // int score = scores.get(i); // 将每次遍历到的元素赋值给score
    29. // if (score < 80){
    30. // // 这个分数必须删除
    31. // scores.remove(i); // 如果用remove会删除一个元素后,他后面的一个元素会往前移动
    32. // i--;// 删除成功后,必须退一步,这样可以保证下次回到这个位置,如此则不会跳过数据
    33. // }
    34. // } //[98, 77, 66, 89, 79, 50, 100]原集合
    35. // System.out.println(scores); //[98, 89, 100]
    36. // 执行第二个方案之前要将上面的方案注释,因为没有如果执行了上面的代码,集合的元素已经发生变化,不是原来的集合元素
    37. // 完美方案二: 倒着遍历,这样集合元素的索引不会发生变化,因为后面的元素已经扫描过了,向前移动也没事
    38. // [98, 77, 66, 89, 79, 50, 100]
    39. for (int i = scores.size() - 1 ; i >= 0 ; i-- ) { // 倒着遍历的初始值是最后一个元素,判断条件是大于等于第一个元素索引
    40. int score = scores.get(i);
    41. if (score >= 80){
    42. scores.remove(i);
    43. }
    44. }
    45. System.out.println(scores);
    46. }
    47. }