为什么完成Arraylist不会通过第二个for循环打印?

时间:2018-05-27 10:08:34

标签: java for-loop if-statement collections

我的完整arrayList没有通过第二个for循环打印。(通过注释突出显示的print语句:第二个循环打印语句),而它通过first for循环打印。

我想要完成的任务。:打印除字符外的arraylist对象。[打印第一个对象,无论字符或任何其他对象]。

我面临的问题:Arraylist对象'2'没有通过第二个for循环打印在控制台上。

import java.util.ArrayList;

public class Test1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    ArrayList al = new ArrayList<>();
    al.add('a');
    al.add('2');

    for(int i=0;i<al.size();i++){
        System.out.println("element enterd in for loop: "+al.get(i));
    }

    for(int i=0;i<al.size();i++){
        System.out.println("element enterd in for loop: "+al.get(i));     //second loop print statement

        if(al.get(i).toString().charAt(0)>=65 & al.get(i).toString().charAt(0)<=122){

            al.remove(i);
            continue;

                }
        }
    }

}

帮助:请帮我弄清楚问题所在。

5 个答案:

答案 0 :(得分:2)

ArrayList中删除元素时,以下元素的索引将递减。因此,您的当前循环需要进行以下调整:

for(int i=0;i<al.size();i++) {
    System.out.println("element enterd in for loop: "+al.get(i));    
    if(al.get(i).toString().charAt(0)>=65 & al.get(i).toString().charAt(0)<=122) {
        al.remove(i);
        i--; // make sure you are not skipping the element following the removed element
        continue;
    }
}

顺便说一句,将Character转换为String仅提取第一个char似乎非常倒退。

简单地避免使用原始类型:

List<Character> al = new ArrayList<>();

al.get(i).toString().charAt(0) > 65

可以成为

al.get(i) > 65

答案 1 :(得分:0)

您在索引a时从列表中删除i = 0。然后列表的大小变为1,i也变为1.因此,i < al.size()false的循环条件i = 1al.size() =1。所以你不要进入循环内部来打印元素2。要在从列表中删除项目时阻止此操作,可以将i的值减1.“

答案 2 :(得分:0)

您可以尝试使用流:

private static boolean isChar(Character x) {
    return ('a' <= x && x <= 'z' ) ||  ('A' <= x && x <= 'Z');
}

public static void main(String[] args) {
    List<Character> al = Arrays.asList('a','2','b','Z','M','4','9','g');

    al.stream().filter(x -> !isChar(x)).forEach(System.out::println);
}

输出:

2
4
9

答案 3 :(得分:0)

您也可以使用迭代器:

    List<Character> al = new ArrayList<>();
    al.add('a');
    al.add('2');
    final Iterator<Character> iterator = al.iterator();
    while (iterator.hasNext()) {
        final Character next = iterator.next();
        System.out.println("element enterd in for loop: " + next);

        if (next.toString().charAt(0) >= 65 & next.toString().charAt(0) <= 122) {
            iterator.remove();
        }
    }

同样的问题是herehere

答案 4 :(得分:0)

请使用以下代码

  ArrayList al = new ArrayList<>();
    al.add('s');
    al.add('2');
    al.add('5');
    al.add('6');
    al.add('e');

    for (int i = 0; i < al.size(); i++) {
        System.out.println("element enterd in for loop: " + al.get(i));
    }
    System.out.println("***************\n");
    for (int i = 0; i < al.size(); i++) {
        if (i == 0) {
            System.out.println("element enterd in for loop: " + al.get(i));
        } else {
            if (!Character.isLetter(al.get(i).toString().charAt(0))) {
                System.out.println("element enterd in for loop: " + al.get(i));
            }
        }
    }