Почему полный Arraylist не печатается через секунду для цикла? - PullRequest
0 голосов
/ 27 мая 2018

Мой полный arrayList не печатается через секунду для цикла. (Оператор печати выделен комментарием: второй цикл печатает оператор), тогда как он печатается через первый цикл for.

Что я пытаюсьдля выполнения. : печать объектов массива, кроме символов. [печать первого объекта независимо от символа или любого другого объекта].

проблема, с которой я сталкиваюсь : объект массива '2'не печатается на консоли через секунду для цикла.

код :

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 голосов
/ 27 мая 2018

Пожалуйста, используйте следующий код

  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));
            }
        }
    }
0 голосов
/ 27 мая 2018

Вы также можете использовать итераторы:

    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();
        }
    }

Тот же вопрос здесь и здесь .

0 голосов
/ 27 мая 2018

Вы удаляете a из списка, когда индекс i = 0.Тогда размер списка становится равным 1, и i также становится равным 1. Следовательно, условие цикла i < al.size() равно false как i = 1, так и al.size() =1.Таким образом, вы не идете внутри цикла, чтобы напечатать элемент 2.Чтобы предотвратить это при удалении элемента из списка, вы можете уменьшить значение i на 1.

0 голосов
/ 27 мая 2018

Вы можете попробовать и использовать потоки:

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
0 голосов
/ 27 мая 2018

Когда вы удаляете элемент из 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
...