[Resolvido] Ajuda com LinkedList, problema com 'add'

Opa, eae galera, beleza? Sou novo aqui no GUJ, então qualquer crítica construtiva a respeito do tópico será aceita :grinning:

Bom, eu estava escrevendo um programa em Java para testar a velocidade de inserção de elementos em uma lista e me deparei com um problema com a classe ‘LinkedList’

Quando eu faço o ‘add(0, int n)’, pelo que eu saiba, se já existir um elemento no índice 0, todos os elementos já existentes serão deslocados de forma linear para a direita, a questão é, os elementos do meu código não estão sendo adicionados corretamente

Segue o código

package elementosprimeiraposicao;

import java.util.ArrayList;
import java.util.List;

public class Teste {

public static void main(String[] args) {
    System.out.println("Inicio de teste...");
    long inicio = System.currentTimeMillis();
    
    //Testando List
    List<Integer> teste = new ArrayList<>();
    
    for (int i = 0; i < 20; i++) {
        teste.add(0,i);
    }
    
    for (int i = 0; i < 50; i++) {
        teste.add(0,i);
    }
    
    for (int i: teste) {
        System.out.println(teste.get(i));
    }
    
    long fim = System.currentTimeMillis();
    System.out.println("Tempo gasto: "+(fim - inicio)+" ms");
    
}

}

Saída

run:
Inicio de teste…
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
30 // nesta linha está dando problema
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Tempo gasto: 2 ms
<
Pelo meu código, estes últimos 20 elementos deveriam seguir a ordem de 0-19, e não 30-49. Realmente não sei o que está acontecendo

Agradeço desde já galera!!

Você diz que quer usar LinkedList mas seu código está usando ArrayList. Algum motivo para essa diferença?

De toda forma, a execução pareceu correta para mim. Veja em : https://ideone.com/smaqc5

Abraço.

1 curtida

Troque este laço:

for (int i: teste) {
    System.out.println(teste.get(i));
}

Por este:

for (int i: teste) {
    System.out.println(i);
}

Como você está usando a sintaxe do enhanced for (ou for each) a variável i já vai conter o elemento da lista e não o índice.
Como sua lista é de objetos Integer o auto unboxing permite a variável do tipo int no seu for.

2 curtidas

Só para reforçar o que o amigo @staroski disse:

Essa é a razão dos valores apresentados.

1 curtida

Opa, agora que eu vi, mas tanto o Linked quanto o Array deram problema para mim, a questão é a inserção errada dos elementos

Valeu!!

Obrigado @staroski e @Villagram por me auxiliarem neste problema, deu certo aqui, mas poderiam me explicar melhor o problema? sou novo em Java também, estou terminando agora a apostila fj11 da caelum

Você tem essa lista:

List<Integer> teste = new ArrayList<>();

E fez esse laço:

for (int i: teste) {
    System.out.println(teste.get(i));
}

Seu laço equivale exatamente à escrever isso aqui:

for (int n = 0; n < teste.size; n++) {
    int i = teste.get(n); // i é o elemento pego na posição n
    System.out.println(teste.get(i)); // agora você está usando o i como se fosse a posição da qual você quer obter o valor
}
2 curtidas

Muita obrigado, agora eu entendi :grin: