Removendo um elemento de uma matriz (Java)

Existe alguma maneira rápida (e agradável) de remover um elemento de um array em Java?

Você pode usar o ArrayUtils de commons lang.

array = ArrayUtils.removeElement(array, element) 

biblioteca commons.apache.org: Javadocs

Sua pergunta não é muito clara. De sua própria resposta, posso dizer melhor o que você está tentando fazer:

 public static String[] removeElements(String[] input, String deleteMe) { List result = new LinkedList(); for(String item : input) if(!deleteMe.equals(item)) result.add(item); return result.toArray(input); } 

NB: Isso não foi testado. A verificação de erros é deixada como um exercício para o leitor (eu lançaria IllegalArgumentException se input ou deleteMe for null; uma lista vazia na input de lista nula não faz sentido. Remover strings nulas do array pode fazer sentido, mas eu Deixarei isso como um exercício também; atualmente, ele lançará um NPE quando tentar chamar equals em deleteMe se deleteMe for null.)

Escolhas que fiz aqui:

Eu usei um LinkedList. A iteração deve ser tão rápida quanto, e você evita qualquer redimensionamento, ou aloca uma lista muito grande se você acabar eliminando muitos elementos. Você poderia usar um ArrayList e definir o tamanho inicial para o comprimento da input. Provavelmente não faria muita diferença.

A melhor opção seria usar uma coleção, mas se ela estiver fora por algum motivo, use arraycopy . Você pode usá-lo para copiar de e para o mesmo array em um deslocamento ligeiramente diferente.

Por exemplo:

 public void removeElement(Object[] arr, int removedIdx) { System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx); } 

Edite em resposta ao comentário:

Não é outro bom caminho, é realmente o único caminho aceitável.

Para alocar uma coleção (cria uma nova matriz), exclua um elemento (que a coleção fará usando arraycopy) e chame toArray (cria uma segunda nova matriz) para cada exclusão nos leva ao ponto em que não é um problema de otimização é uma programação criminosamente ruim.

Suponha que você tenha uma matriz ocupando, digamos, 100 MB de RAM. Agora você deseja iterar e excluir 20 elementos.

De uma chance…

Eu sei que você presumiria que não seria tão grande, ou que se você estivesse excluindo tantos de uma só vez, codificaria de forma diferente, mas consertei um monte de códigos em que alguém fez suposições como essa.

Você não pode remover um elemento do array Java básico. Dê uma olhada em várias collections e ArrayList.

Uma solução interessante seria usar uma List em vez de array em primeiro lugar.

 List.remove(index) 

Se você tiver que usar arrays, duas chamadas para System.arraycopy provavelmente serão as mais rápidas.

 Foo[] result = new Foo[source.length - 1]; System.arraycopy(source, 0, result, 0, index); if (source.length != index) { System.arraycopy(source, index + 1, result, index, source.length - index - 1); } 

( Arrays.asList também é um bom candidato para trabalhar com arrays, mas não parece suportar a remove .)

Acho que a pergunta estava pedindo uma solução sem o uso da API de collections. Um usa arrays para detalhes de baixo nível, onde o desempenho é importante, ou para uma integração de SOA fracamente acoplada. No final, não há problema em convertê-los em collections e passá-los para a lógica de negócios.

Para o material de desempenho de baixo nível, ele geralmente já é ofuscado pelo imperativo rápido e sujo de mistura de estados por loops forçados, etc. Nesse caso, a conversão de collections e matrizes é trabalhosa, ilegível e até mesmo intensiva em resources.

By the way, TopCoder, alguém? Sempre esses parâmetros de matriz! Então, esteja preparado para ser capaz de lidar com eles quando estiver na Arena.

Abaixo está minha interpretação do problema e uma solução. É diferente em funcionalidade de ambos os dados por Bill K e jelovirt . Além disso, ele lida com elegância quando o elemento não está na matriz.

Espero que ajude!

 public char[] remove(char[] symbols, char c) { for (int i = 0; i < symbols.length; i++) { if (symbols[i] == c) { char[] copy = new char[symbols.length-1]; System.arraycopy(symbols, 0, copy, 0, i); System.arraycopy(symbols, i+1, copy, i, symbols.length-i-1); return copy; } } return symbols; } 

Você pode usar a API ArrayUtils para removê-lo de uma maneira “agradável”. Ele implementa muitas operações (remover, localizar, adicionar, contém, etc) em matrizes.
Dê uma olhada. Isso tornou minha vida mais simples.

Mais algumas pré-condições são necessárias para as escritas por Bill K e dadinn

 Object[] newArray = new Object[src.length - 1]; if (i > 0){ System.arraycopy(src, 0, newArray, 0, i); } if (newArray.length > i){ System.arraycopy(src, i + 1, newArray, i, newArray.length - i); } return newArray; 

Você não pode alterar o tamanho de uma matriz, mas pode alterar os valores mantidos pelo índice, copiando novos valores e armazenando-os em um número de índice existente. 1 = mike, 2 = jeff // 10 = george 11 vai para 1 overwriting mike.

 Object[] array = new Object[10]; int count = -1; public void myFunction(String string) { count++; if(count == array.length) { count = 0; // overwrite first } array[count] = string; } 

ok, thx muito agora eu uso sth assim:

 public static String[] removeElements(String[] input, String deleteMe) { if (input != null) { List list = new ArrayList(Arrays.asList(input)); for (int i = 0; i < list.size(); i++) { if (list.get(i).equals(deleteMe)) { list.remove(i); } } return list.toArray(new String[0]); } else { return new String[0]; } } 

Copie sua matriz original em outra matriz, sem o elemento a ser removido.

Uma maneira mais simples de fazer isso é usar uma List, Set … e usar o método remove ().

Troque o item a ser removido com o último item, se o redimensionamento do array não for de interesse.

Espero que você use as collections java collection / java commons!

Com um java.util.ArrayList você pode fazer coisas como as seguintes:

 yourArrayList.remove(someObject); yourArrayList.add(someObject); 

Use um ArrayList :

 alist.remove(1); //removes the element at position 1 

Claro, crie outra matriz 🙂