Requisitos do Desafio
O objetivo deste exercício é desenvolver um sistema de gerenciamento de números de identificação (IDs) utilizando a estrutura de dados ArrayList em Java. O programa deve processar uma série de comandos de entrada para manipular a lista de identificadores.
- add: Seguido por um inteiro
n, indicando a quantidade de IDs a serem inseridos. Antes da inserção, o sistema deve validar o ID (após remover espaços em branco nas extremidades, o comprimento da string deve ser exatamente 18). Se o ID for válido e não estiver na lista, ele é adicionado ao final. Se já existir, nanhuma ação de inserção é tomada. - del: Seguido por uma string
idStr, solicitando a remoção deste ID da lista. - search: Seguido por uma string
idStr, solicitando a busca deste ID. Se encontrado, o programa deve exibir seu índice; caso contrário, deve exibir-1. - info: Exibe a quantidade total de elementos na lista, seguido pela impressão de cada elemento em uma nova linha.
- clear: Remove todos os elementos armazenados na lista.
Exemplo de Entrada
add
8
330226196605054190
34080019810819327X
330226196605054190
34080019810819327X
653222196603062607
2312
653222196603062607
444444444444444
info
del
330226196605054191
del
330226196605054190
search
330226196605054191
search
34080019810819327X
clear
info
end
Exemplo de Saída
exist
exist
exist
3 add success
3
330226196605054190
34080019810819327X
653222196603062607
del failed
del success
-1
0
0
Aspectos Técnicos Fundamenatis
- Validação de Dados: Durante a operação de adição, é crucial sanitizar a string removendo espaços em branco (
trim()) e verificar se o comprimento resultante é igual a 18. Além disso, deve-se verificar a duplicidade antes de inserir o registro. - Operações com ArrayList: Aproveitar os métodos nativos da classe
ArrayList, comocontains()para verificação de duplicidade,remove()para exclusão eindexOf()para busca de índices, otimizando a legibilidade e a performance do código. - Processamento de Fluxo de Entrada: Utilizar a classe
Scannerpara ler comandos e parâmetros de forma sequencial, estruturando o fluxo de controle com blocosswitchou condicionais encadeadas para tratar cada operação de forma isolada.
Estratégia de Implementação
A solução é construída em torno de um loop principal que lê os comandos até encontrar a palavra-chave de encerramento (end). Para o comando add, a lógica de validação foi estruturada para ignorar strings com comprimento inválido, sinalizar com "exist" caso o ID já esteja presente na coleção, e apenas incrementar o contador de sucessos quando uma nova inserção for efetivada. Os demais comandos mapeiam diretamente para as operações correspondentes da interface List do Java.
Código-Fonte Completo
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
ArrayList<String> records = new ArrayList<>();
while (reader.hasNext()) {
String action = reader.next();
if ("end".equals(action)) {
break;
}
switch (action) {
case "add":
int quantity = reader.nextInt();
int successCount = 0;
for (int i = 0; i < quantity; i++) {
String rawId = reader.next().trim();
if (rawId.length() != 18) {
continue;
}
if (records.contains(rawId)) {
System.out.println("exist");
} else {
records.add(rawId);
successCount++;
}
}
System.out.println(successCount + " add success");
break;
case "del":
String targetDel = reader.next();
if (records.remove(targetDel)) {
System.out.println("del success");
} else {
System.out.println("del failed");
}
break;
case "search":
String targetSearch = reader.next();
System.out.println(records.indexOf(targetSearch));
break;
case "info":
System.out.println(records.size());
for (String record : records) {
System.out.println(record);
}
break;
case "clear":
records.clear();
break;
default:
break;
}
}
reader.close();
}
}