1
resposta

List - Adicionar elemento em um índice maior que size (index = size*n)?

Participei de um desafio onde dado um input de Inteiros N e queries Q, utilizando a Interface List devo ler os Inteiros N e popular um List, depois ler as queries Q que podem ser "Insert" ou "Delete" executar as queries e por fim imprimir a lista resultante.

Onde:

1<=N<=4000;

1<=Q<=4000 ;

Insert (index, value)

Delete (Index)

Ocorre que meu código falhou no seguinte cenário:

Insert

441 58

List.size = 47 então o insert no indice 441 (list.add(441, 58)) lança IndexOutOfBoudException

Isso ocorreu em apenas 1 dos 10 test cases do desafio, ou seja em 9 de 10 o código funcionou.

Exemplo de input:

5
12 0 1 78 12
2
Insert
5 23
Delete
0

Output esperado:

0 1 78 12 23

Sei que as implementações de List aumentam seu sizedinamicamente.

Porem fiquei na dúvida se é um erro de implementação meu ou erro do test case.

Pergunta é possível adicionar um elemento utilizando um ArryList num índice maior que .size() ? Exemplo size=50 add no indice 400.

Resolução que escrevi com o input que gera o erro no link abaixo:

PS. O trecho comentado eu adicionei após os resultados para tentar descobrir o que estava acontecendo.

Aqui o input que gera o erro: https://hr-testcases-us-east-1.s3.amazonaws.com/16960/input06.txt?AWSAccessKeyId=AKIAR6O7GJNX5DNFO3PV&Expires=1651086923&Signature=xdLqekslDhe2aM3rFJekkUBwQF8%3D&response-content-type=text%2Fplain

public class Java_List {


    static List<Integer> anArray = new ArrayList<>();

    public static void main(String[] args) {

        Scanner in = new Scanner(sample);

        int membersSize = in.nextInt();
        in.nextLine();

        for (int i = 0; i < membersSize; i++) {
            anArray.add(in.nextInt());
        }


        while (in.hasNext()) {
          in.nextLine();

            if (in.hasNext("Insert")) {
                in.nextLine();
                while (in.hasNextInt()) {
                    int index = in.nextInt();
                    int value = in.nextInt();
                    add(index, value);
                }
            } else if (in.hasNext("Delete")) {
                in.nextLine();
                delete(in.nextInt());

            }
        }
        in.close();
        print();

    }


    static void delete(int index) {
        try {
            anArray.remove(index);
        } catch (IndexOutOfBoundsException e){

        }

    }

    static void add(int index, int value) {

       /* if(index > anArray.size()){
            ArrayList<Integer> temp = new ArrayList<Integer>(index +1);
            temp.addAll(anArray);
            for (int i = anArray.size(); i< index; i++){
                temp.add(i, null);
            }

            anArray.addAll(temp);

        }*/
        anArray.add(index, value);
    }

    static void print() {

        anArray.forEach(value -> {
            if(value != null) {
                System.out.print(value + " ");
            }
        });
    }

}
1 resposta

Olá Cleber, tudo bem?

Pelo que entendi, você está utilizando a interface List para popular uma lista com inteiros e depois executar queries de inserção e remoção. Sobre sua pergunta, é possível adicionar um elemento utilizando um ArrayList num índice maior que size()? Sim, é possível. Quando você adiciona um elemento em um índice maior que o tamanho atual da lista, o ArrayList aumenta dinamicamente seu tamanho para acomodar o novo elemento.

No entanto, no seu código, você está tentando adicionar um elemento em um índice que é muito maior que o tamanho atual da lista, o que gera uma exceção IndexOutOfBoundsException. Isso pode acontecer se houver algum erro na lógica do seu código ou se o input estiver incorreto.

Uma sugestão é verificar se o índice passado para a função add() está dentro dos limites da lista antes de adicioná-lo. Caso contrário, você pode tratar a exceção ou simplesmente ignorá-la.

Espero ter ajudado e bons estudos!