ArrayList sem repetição

3 respostas
java
V

Eae galera.

Estou fazendo uma atividade da facu, tenho que criar um sistema de lista de nomes (com espaço de 50). Uma das exigências do exercício é não repetir o nome que já foi adicionado, estou usando o ArrayList porque tenho que fazer em vetores, e ArrayList são vetores, certo?

Fusei na internet e achei um código que tem o macete pra não repetir o nome no ArrayList, só que não consigo adaptar ele ao meu. Como estendo uma classe na outra?

Basicamente preciso adaptar esse código debaixo, com o meu, que está debaixo deste código. Segue fonte do código de ArrayList sem repetição.

import java.util.ArrayList;
import java.util.Arrays;

public class Lista<T> extends ArrayList<T>{

    public Lista() {
        super(); //chame o construtor de ArrayList
    }

    public boolean contains(Object[] o){
        //percorre o bjeto 'Lista':

        // esse for da erro
        for(int i=0; i< this.size(); i++){
            /* cria um array de objetos e faz um 'type-cast'
            desta própria classe atribuindo a ele o valor do
            elemento, e isso para cada elemento, de forma que
            todos os elementos sejam tratados como arrays de
            objetos:
            */

            // essa linha da vermelho 
            Object[] toCompare = (Object[])this.get(i);

            if(Arrays.equals(o, toCompare)){
                return true;
            }
        }
        return false;
    }
}

https://www.vivaolinux.com.br/dica/Extendendo-a-classe-ArrayList-para-criar-listas-sem-repeticao

Meu código:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 *
 * @author Vinicius
 */
public class Lista {

    public List<String> lista = new ArrayList<String>(50); //inicia lista
    private String nome;
    private boolean ativo;
    private int numero;

    void adicionarNome() {
        Scanner entrada = new Scanner(System.in);
        for (int i = 0; i <= 0; i++) {
            System.out.println("Digite o nome: ");
            nome = entrada.nextLine();
            lista.add("Nome: " + nome);
        }
    }

    void removerNome() {
        System.out.println("Digite nome para remoção");
        Scanner leitor = new Scanner(System.in);
        nome = leitor.nextLine();
        boolean remove = lista.remove(nome);
    }

    void ordenar() {
        Collections.sort(lista);
    }

    void pesquisarNome() {
        System.out.println(lista);
    }

    void menu() {
        Scanner entrada = new Scanner(System.in);
        while (numero != 5) {
            System.out.println("[1] Adicionar nome ");
            System.out.print("[2] para exibir lista");
            System.out.print("[3] para ordenar lista");
            System.out.print("[4] para excluir nome");
            System.out.print("[0] para sair");
            numero = entrada.nextInt();
            switch (numero) {
                case 1:
                    adicionarNome();
                    break;
                case 2:
                    pesquisarNome();
                    break;
                case 3:
                    ordenar();
                    break;
                case 4:
                    removerNome();
                    break;
                case 0:
                    System.out.println("Sair");
                    return;
            }
        }
    }

    public static void main(String args[]) {
        Lista a = new Lista();
        a.menu();
    }
}

3 Respostas

D

Pode utilizar o comando contains, acredito que no seu caso resolva, ou fazer um for e varrer item a item para ver se existe

Com contains:

ArrayList<String> lista = new ArrayList<>();

if (lista.contains(""))
{
    // não insere nome existente
}
else
{
    // insere
}

Com for:

String nome = "guj";
boolean status = false;
for(String item : lista)
{
	if (item.equals(nome))
	{
		status = true;
		break;
	}
}
if (status)
{
	// não insere nome existente
}
else
{
   // insere 
}

Adeque ao seu programa!

H

Bom dia!

pelo que eu pude notar você acabou se perdendo no seu código.

Em primeiro lugar você deve conhecer os tipos de coleções que estão disponíveis no java.

Sendo que nesse seu caso se não houver a necessidade de manter a ordem dos itens adicionados na lista é não tiver que lançar nenhuma mensagem no console caso o item já exista um simples Set resolveria seu problema.

Um problema em seu código e que você declarou um ArrayList no escopo de instancia logo apos a declaração da classe é também declarou a sua lista personalizada no escopo do método main, isso pode esta te confundindo no momento da execução já que você pode estar acreditando estar adicionando os nomes na sua Lista quando na verdade esta adicionando no simples ArrayList.

segue esse link que tem uma boa explicação sobre coleções java.
https://www.caelum.com.br/apostila-java-orientacao-objetos/collections-framework/#16-8-principais-interfaces-java-util-collection

P

Sem duvida vc poderia usar a interface Set e uma implementação da mesma como o HashSet

Aqui tem alguns exemplos.
http://www.linhadecodigo.com.br/artigo/3669/trabalhando-com-a-interface-set-no-java.aspx

Vc ate pode criar um Wrapper para o ArrayList que vai verificar se vc ja adicionou aquele elemento, mas vai ser cada vez mais lento adicionar ( imagine que vc colocou 49 strings e vai tentar adicionar a ultima… vc vai verificar uma por uma e esse custo pode ser proibitivo ).

Se vc trabalha com numeros ou qualquer coisa q pudesse ser ordenavel seria simples de encontrar elementos duplicados, mas o Set vai garantir isso pra vc.

Criado 27 de agosto de 2016
Ultima resposta 29 de ago. de 2016
Respostas 3
Participantes 4