Problema de conversão - ArrayList

4 respostas
javacrivo
joaostm

Estou tendo problemas de compilação com o algoritmo do Crivo que realiza a identificação de números primos. Funcionou perfeitamente com array. Porém, ao tentar implementar por meio de ArrayList, me vi diante de alguns erros que até consegui corrigir, mas este persiste apontando algum erro de conversão que não consegui compreender. Poderiam indicar algum tópico ou possível solução que me ajude a entender? Desde já, agradeço.

Código:
`
import java.util.*;

public class CrivoEratostenes {

private int contador = 0;

private ArrayList<Boolean> primos = new ArrayList<Boolean>();

public CrivoEratostenes(int size) {

    for (int i = 0; i < primos.size(); i++) {
        primos.add(true);
    }
    buscaPrimos();
}

public int getContador() {
    return contador;
}

public ArrayList<Boolean> getPrimos() {
    return primos;
}

private void buscaPrimos() {

    for (int i = 2; i < primos.size(); i++) {
        if (primos.get(i)) {
            for (int j = i; i * j < primos.size(); j++) {
                primos.set(i * j, false);
            }
            contador++;
        }
    }
}

public static void main(String[] args) {
    ArrayList<Boolean> arrayFinal = new ArrayList<Boolean>();
    CrivoEratostenes s = new CrivoEratostenes(30);
    arrayFinal.add(s.getPrimos());
    for (int i = 2; i < arrayFinal.size(); i++) {
        if (arrayFinal.get(i)) {
            System.out.printf("%d é primo!", i);

        }
    }
}

}`

Compilation error:

(ArrayList < Boolean>) cannot be converted to Boolean.

Só não compreendi o porquê de apontar conversão para Boolean se o getPrimos, alocado no ArrayFinal, está retornando um ArrayList<Boolean> e não simplesmente um Boolean.

4 Respostas

RoinujNosde

Sua ArrayList é do tipo Boolean, logo o método add pede um Boolean, não ArrayList (que é o que você está passando).
Você pode usar o método addAll, que aceita uma coleção.

E por que está criando uma nova ArrayList? Poderia reutilizar a que o método getPrimos retorna

joaostm

Sobre o getPrimos, ele retorna todos os valores do ArrayList primos como true. Crei uma nova Lista que copia a anterior e a modifica sem alterar essa primeira.

Utilizei o addAll e funcionou. Mas, até onde testei, só suportou até cerca de 40000 inserções apontando a exceção

ArrayIndexOutBoundsException

Mesmo delimitando que o tamanho máximo do novo ArrayList seria < size isso pode ocorrer? Por quê?

RoinujNosde

Mostra o erro completo.

joaostm

Código depois das modificações:
`
import java.util.*;

public class CrivoEratostenes {

private int contador = 0;

private ArrayList<Boolean> primos = new ArrayList<Boolean>();

public CrivoEratostenes(int max) {

    for (int i = 0; i < max; i++) {
        primos.add(true);
    }
    buscaPrimos();
}

public int getContador() {
    return contador;
}

public ArrayList<Boolean> getPrimos() {
    return primos;
}

private void buscaPrimos() {

    for (int i = 2; i < primos.size(); i++) {
        if (primos.get(i)) {
            for (int j = i; i * j < primos.size(); j++) {
                primos.set(i * j, false);
            }
            contador++;
        }
    }
}

public static void main(String[] args) {
    ArrayList<Boolean> arrayFinal = new ArrayList<Boolean>();
    CrivoEratostenes s = new CrivoEratostenes(50000);
    arrayFinal.addAll(s.getPrimos());
    for (int i = 2; i < arrayFinal.size(); i++) {
        if (arrayFinal.get(i)) {
            System.out.printf("%d é primo.\n", i);
        }
    }
    System.out.println(s.getContador());
 }

}`

Erro da compilação:

Criado 17 de abril de 2021
Ultima resposta 17 de abr. de 2021
Respostas 4
Participantes 2