Problema com ArrayList Java

6 respostas Resolvido
H

Sou iniciante na programação em Java. Estou tentando criar uma agenda de contatos.

O que eu quero é mudar o valor de um elemento cujo atributo é estático. E este elemento esta num ArrayList.

public class Contato {

public static ArrayList<Contato> agenda = new ArrayList<>();
Contato contato = null;

private String nome;
private String telefone;
private static int count = 0;
private int codigo;

public int getCodigo() {
    return codigo;
}

public void setCodigo(int codigo) {
    this.codigo = codigo;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getTelefone() {
    return telefone;
}

public void setTelefone(String telefone) {
    this.telefone = telefone;
}

@Override
public String toString() {
    return "\n------------------------\n"
            + "Código: " + getCodigo()
            + "\nNome: " + getNome() + "\n"
            + "Telefone: " + getTelefone() + ""
            + "\n------------------------";

}

public boolean buscarPorCodigo(int codigo) {

    for (int i = 0; i < agenda.size(); i++) {

        if (agenda.get(i).getCodigo() == codigo) {

            System.out.println(agenda.get(i).toString());
            return true;

        }

    }

    return false;
}

public void cadastrar() {

    contato = new Contato();

    contato.setCodigo(count++);
    
    System.out.print("Nome: ");
    contato.setNome(SisAgenda01.entrada.nextLine());
    System.out.print("Telefone: ");
    contato.setTelefone(SisAgenda01.entrada.nextLine());

    agenda.add(contato);

    System.out.println("\n_____ CADASTRADO COM SUCESSO! _____\n");

}

public void mostrarContatos() {

    if (agenda.isEmpty()) {

        System.out.println("\n_____ NENHUM CONTATO CADASTRADO! _____\n");

    } else {

        for (int i = 0; i < agenda.size(); i++) {

            if (agenda.get(i) != null) {

                System.out.println(agenda.get(i).toString());

            }

        }

    }

}

public void editarContato() {

    System.out.print("Digite o código: ");
    int codigo = Integer.parseInt(SisAgenda01.entrada.nextLine());

    if (buscarPorCodigo(codigo)) {

        for (int i = 0; i < agenda.size(); i++) {

            if (agenda.get(i).getCodigo() == codigo) {

                int opcao;
                System.out.print("1 - Editar nome\n"
                        + "2 - Editar número\n"
                        + "--> ");
                opcao = Integer.parseInt(SisAgenda01.entrada.nextLine());

                switch (opcao) {

                    case 1:
                        String novoNome;
                        System.out.print("Novo nome: ");
                        novoNome = SisAgenda01.entrada.nextLine();
                        agenda.get(i).setNome(novoNome);
                        System.out.println("\n_____ ALTERADO COM SUCESSO _____!\n");
                        break;
                    case 2:
                        String novoNumero;
                        System.out.print("Novo número: ");
                        novoNumero = SisAgenda01.entrada.nextLine();
                        agenda.get(i).setTelefone(novoNumero);
                        System.out.println("\n_____ ALTERADO COM SUCESSO _____!\n");
                        break;
                    default:
                        System.out.println("\n_____ OPÇÃO INVÁLIDA! _____\n");
                }

            }
        }

    } else {

        System.out.println("\n_____ CONTATO NÃO ENCONTRADO! _____\n");

    }

}

public void excluirContato() {

    System.out.print("Código: ");
    int op = Integer.parseInt(SisAgenda01.entrada.nextLine());

    int confirma;

    if (buscarPorCodigo(op)) {

        System.out.print("\n------- DESEJA REALMENTE EXCLUIR? -------\n"
                + "1 - Sim\n"
                + "2 - Não\n"
                + "---> ");
        confirma = Integer.parseInt(SisAgenda01.entrada.nextLine());

        if (confirma == 1) {

            for (int i = 0; i < agenda.size(); i++) {

                if (agenda.get(i) != null) {

                    if (op == agenda.get(i).getCodigo()) {

                        
                        agenda.remove(i);
                        System.out.println("\n----- EXCLUÍDO COM SUCESSO! -----\n");

                    }

                }

            }

        } else if (confirma == 2) {

            System.out.println("\n_____ CONTATO NÃO EXCLUÍDO! _____\n");

        } else {

            System.out.println("\n_____ OPÇÃO INVÁLIDA! _____\n");

        }

    }

}

}

O que eu quero é que… quando um contato for excluído, os contatos que restam na lista fiquem com o código em ordem crescente. Por exemplo:
Tenho 3 contatos cadastrados na lista, com os respectivos códigos:
Contato 1 = código: 1
Contato 2 = código 2.
Contato 3 = código 3.

Gostaria que quando eu excluir o Contato 2, o Contato 3 passe a ter código 2., ou o próximo contato que for cadastrado receba o código 2.

6 Respostas

staroski

Explica direito essa sua lógica pois você pôs um OU na frase acima e isso não parece fazer muito sentido.

Você tem a seguinte lista:

Contato A 1
Contato B 2
Contato C 3
Contato D 4

Ao excluir o Contato B 2 você quer que todos os elementos subsequentes tenham seu código ajustado, ficando assim:

Contato A 1
Contato C 2
Contato D 3

E quando você cadastrar um novo contato quer que ele receba o código 2 novamente e que os outros voltem a ser incrementados, é isso?
Ficando assim?

Contato A 1
Contato Novo 2
Contato C 3
Contato D 4
H

Isso mesmo. Só que pode ser das seguintes formas:

Contato A 1
Contato Novo 2
Contato C 3
Contato D 4

Ou

Contato A 1
Contato C 2
Contato D 3
Contato E(novo) 4

staroski

E qual o critério para escolher entre a primeira forma ou a segunda?

A segunda forma é mais simples, basta você setar como código dos contatos o índice + 1 de sua lista.

A primeira forma você teria que armazenar o código do cara que foi removido para depois, quando cadastrar um novo usar esse código e incrementar o código dos contatos seguintes.

H

Não tem nenhum critério. Da forma mais simples resolve. Pode me mostrar como ficaria o código?

staroski
Solucao aceita

Seu código estava incompleto, não sei como é o seu método main, todavia, assim deve funcionar:

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

public class Contato {

    private static final List<Contato> agenda = new ArrayList<>();

    private String nome;
    private String telefone;
    private int codigo;

    public Contato buscarPorCodigo(int codigo) {
        for (Contato contato : agenda) {
            if (contato.getCodigo() == codigo) {
                System.out.println(contato);
                return contato;
            }
        }
        return null;
    }

    public void cadastrar() {
        Contato contato = new Contato();
        contato.setCodigo(agenda.size() + 1);
        System.out.print("Nome: ");
        contato.setNome(SisAgenda01.entrada.nextLine());
        System.out.print("Telefone: ");
        contato.setTelefone(SisAgenda01.entrada.nextLine());
        agenda.add(contato);
        System.out.println("\n_____ CADASTRADO COM SUCESSO! _____\n");
    }

    public void editarContato() {
        System.out.print("Digite o código: ");
        int codigo = Integer.parseInt(SisAgenda01.entrada.nextLine());
        Contato contato = buscarPorCodigo(codigo);
        if (contato != null) {
            System.out.print("1 - Editar nome\n"
                    + "2 - Editar número\n"
                    + "--> ");
            int opcao = Integer.parseInt(SisAgenda01.entrada.nextLine());
            switch (opcao) {
                case 1:
                    System.out.print("Novo nome: ");
                    String novoNome = SisAgenda01.entrada.nextLine();
                    contato.setNome(novoNome);
                    System.out.println("\n_____ ALTERADO COM SUCESSO _____!\n");
                    break;
                case 2:
                    System.out.print("Novo número: ");
                    String novoNumero = SisAgenda01.entrada.nextLine();
                    contato.setTelefone(novoNumero);
                    System.out.println("\n_____ ALTERADO COM SUCESSO _____!\n");
                    break;
                default:
                    System.out.println("\n_____ OPÇÃO INVÁLIDA! _____\n");
            }
        } else {
            System.out.println("\n_____ CONTATO NÃO ENCONTRADO! _____\n");
        }
    }

    public void excluirContato() {
        System.out.print("Código: ");
        int codigo = Integer.parseInt(SisAgenda01.entrada.nextLine());
        Contato contato = buscarPorCodigo(codigo);
        if (contato != null) {
            System.out.print("\n------- DESEJA REALMENTE EXCLUIR? -------\n"
                    + "1 - Sim\n"
                    + "2 - Não\n"
                    + "---> ");
            int confirma = Integer.parseInt(SisAgenda01.entrada.nextLine());
            if (confirma == 1) {
                agenda.remove(contato);
                System.out.println("\n----- EXCLUÍDO COM SUCESSO! -----\n");
                // recalcular os códigos
                int novoCodigo = 0;
                for (Contato contatoParaAtualizar : agenda) {
                    contatoParaAtualizar.setCodigo(++novoCodigo);
                }
            } else if (confirma == 2) {
                System.out.println("\n_____ CONTATO NÃO EXCLUÍDO! _____\n");
            } else {
                System.out.println("\n_____ OPÇÃO INVÁLIDA! _____\n");
            }
        }
    }

    public int getCodigo() {
        return codigo;
    }

    public String getNome() {
        return nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void mostrarContatos() {
        if (agenda.isEmpty()) {
            System.out.println("\n_____ NENHUM CONTATO CADASTRADO! _____\n");
        } else {
            for (Contato contato : agenda) {
                System.out.println(contato);
            }
        }
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    @Override
    public String toString() {
        return "\n------------------------\n"
                + "Código: " + getCodigo()
                + "\nNome: " + getNome() + "\n"
                + "Telefone: " + getTelefone() + ""
                + "\n------------------------";

    }
}
H

Deu certo sim. Muito obrigado!

Criado 16 de junho de 2019
Ultima resposta 19 de jun. de 2019
Respostas 6
Participantes 2