в чем ошибка? Почему когда я сделал add в arraylist элементы удалились, и уже вместо удаленных появились добавленные?

Рейтинг: 0Ответов: 2Опубликовано: 21.07.2023

вот задача - /* Напишите программу, которая считает натуральное число n c клавиатуры и создаст список, в котором первый и последний элементы будут равны строчке 1, а между ними будет n 0. Выведите список на экран через пробел. */ вот сам код -

import java.util.ArrayList;
class MyProgram{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ArrayList <Integer> list = new ArrayList <> (n);
        for(int c = 0; c < n; c++) {
            list.add(c, 0);
        }
        list.add(0, 1);
        list.add(n-1, 1);
        for(int i = 0; i < n; i++) {
            System.out.print(list.get(i) + " ");
        }
    }
} 

если входные данные - 3 - в выводе должно быть 1 0 0 0 1, а у меня 1 0 1, хотя я создал список n нулей и по краям сделал add единиц, крайние элементы удалились и появились единицы. Как исправить? просьба исправить мой код, а не писать свой

Ответы

▲ 1Принят

Два момента:

  1. list.add(n-1, 1); добавит 1 не в конец списка, а по индексу n - 1, то есть 2, то есть после двух добавлений получится список [1, 0, 1, 0, 0].
  2. при выводе содержимого списка используется неизменяемое значение n, равное 3, вместо реальной длины списка, которая стала равной 5 после двух добавлений.

Для исправления достаточно указать:

list.add(0, 1); // добавит 1 в начало
list.add(1);    // добавит 1 в конец

Соответственно, перед печатью следует "обновить" значение n:

n = list.size(); // запомнить новую длину

Или же просто использовать цикл foreach вместо обычного for:

for (int x : list) {
    System.out.print(x + " ");
}

Также для получения списка из n нулей можно использовать стандартный метод Collections::nCopies вместо цикла:

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List <Integer> list = new ArrayList<>(Collections.nCopies(n, 0));
list.add(0, 1);
list.add(1);
for (int x : list) {
    System.out.print(x + " ");
}
▲ 1

Вариант:

import java.util.ArrayList;
import java.util.Scanner;

class MyProgram{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ArrayList <Integer> list = new ArrayList <>();
        for(int c = 0; c < n; c++) {
            list.add(0);
        }
        list.add(0, 1);
        list.add(1);
        for(int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
    }
}