Удалить числа больше чем x в ArrayList - PullRequest
0 голосов
/ 11 февраля 2019

Я нуб в Java и сейчас изучаю дженерики.Этот код должен удалить любое целое число больше пяти.Я набрал [10, 11, 12, 1], теоретически я должен получить только [3, 4, 6, 1].Но я получаю [3, 4, 6, 11 , 1], я не понимаю, почему ..?

public static void main(String args[]) throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(3);
    list.add(4);
    list.add(56);
    list.add(6);

    for (int i = 0; i < 4; i++){
        String s = reader.readLine();
        list.add(Integer.parseInt(s));
    }

    for (int i = 0; i < list.size(); i++){
        if (list.get(i) > 5)
            list.remove(i);
        //else
            //i++;
    }
    System.out.println(list);
}

10 11 12 1

[3, 4, 6, 11, 1]

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Если вы используете Java 8+, вы можете просто использовать ArrayList::removeIf примерно так:

list.removeIf(i -> i > 5);

ideone demo

0 голосов
/ 11 февраля 2019

Я думаю, что это было упражнение, чтобы понять, как удалить из списка, но в противном случае, вот как вы могли бы проверить, прежде чем добавлять к нему:

  public static void main(String args[]) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();



    for (int i = 0; i < 4; i++){
        System.out.println("type a number: ");
        String s = reader.readLine();
        int j = Integer.parseInt(s);
        if(j < 5) {
            list.add(Integer.parseInt(s));
        }
    }


    System.out.println(list);
}
0 голосов
/ 11 февраля 2019

Если вы прочитаете документацию для List.remove(), вы увидите, что элементы после индекса i смещены влево.Это означает, что в вашей текущей реализации вы пропускаете один элемент после каждого удаления, поэтому, если рядом находятся два элемента, размер которых превышает 5, будет удален только один из них.

Что вы можетеdo также сдвигает назад текущий индекс на один шаг после удаления элемента с i--;.Таким образом, ваш код станет

public static void main(String args[]) throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(3);
    list.add(4);
    list.add(56);
    list.add(6);

    for (int i = 0; i < 4; i++){
        String s = reader.readLine();
        list.add(Integer.parseInt(s));
    }

    for (int i = 0; i < list.size(); i++){
        if (list.get(i) > 5) {
            list.remove(i);
            i--;
        }
    }
    System.out.println(list);
}

. В результате вы получите [3, 4, 1], удалив все числа больше 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...