Eu tento com um laço assim
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Mas não é legal. Alguém pode me sugerir uma solução melhor?
Alguns benchmarks úteis para tomar melhores decisões:
Iterator
? Dig java-doc. Você está emRespostas:
Experimentar:
Leia a API Java . O código será lançado
java.lang.UnsupportedOperationException
para listas imutáveis (como criadas comArrays.asList
); veja esta resposta para mais detalhes.fonte
List.removeAll()
é n ^ 2 . Apenas dizendo.O(n)
para ambosArrayList
eLinkedList
.contains()
loop em toda a matriz) e já que osingleton
é apenas um elementoN * 1 = N
. No entanto, geralmente seriaN^2
.A partir de 2015, esta é a melhor maneira (Java 8):
Nota: Este código será lançado
java.lang.UnsupportedOperationException
para listas de tamanho fixo (como criadas com Arrays.asList), incluindo listas imutáveis.fonte
removeIf
é mais rápido, mas é um palpite.Arrays.asList
não é imutável . É de tamanho fixo.fonte
Não eficiente, mas curto
fonte
Se você preferir objetos de dados imutáveis, ou se não quiser ser destrutivo para a lista de entradas, poderá usar os predicados do Guava.
fonte
fonte
removeAll(..null..)
. Obrigado!Antes do Java 8, você deve usar:
Uso pós-Java 8:
A razão aqui é a complexidade do tempo. O problema com matrizes é que uma operação de remoção pode levar O (n) tempo para ser concluída. Realmente em Java, esta é uma cópia da matriz dos elementos restantes sendo movidos para substituir o ponto vazio. Muitas outras soluções oferecidas aqui acionarão esse problema. O primeiro é tecnicamente O (n * m) onde m é 1 porque é um nulo único: então O (n)
Você deve remover All do singleton, internamente ele faz um batchRemove () que possui uma posição de leitura e uma posição de gravação. E itera a lista. Quando atinge um nulo, ele simplesmente itera a posição de leitura em 1. Quando eles são os mesmos que passam, quando são diferentes, ele continua se movendo ao copiar os valores. Então, no final, apara ao tamanho.
Ele efetivamente faz isso internamente:
O que você pode ver explicitamente é uma operação O (n).
A única coisa que poderia ser mais rápida é se você iterasse a lista dos dois extremos e, quando encontrasse um nulo, defina seu valor igual ao valor encontrado no final e diminua esse valor. E iterou até que os dois valores correspondessem. Você estragaria o pedido, mas reduziria muito o número de valores que você definiu versus os que você deixou sozinho. Qual é um bom método para saber, mas não ajudará muito aqui, pois .set () é basicamente gratuito, mas essa forma de exclusão é uma ferramenta útil para o seu cinto.
Embora isso pareça bastante razoável, o .remove () no iterador chama internamente:
Qual é novamente a operação O (n) na remoção. Ele faz um System.arraycopy () que novamente não é o que você deseja, se você se preocupa com a velocidade. Isso torna n ^ 2.
Há também:
Qual é O (m * n ^ 2). Aqui, não apenas iteramos a lista. Reiteramos a lista inteira, sempre que correspondermos ao nulo. Em seguida, fazemos n / 2 (médias) operações para executar o System.arraycopy () para executar a remoção. Você poderia literalmente ordenar a coleção inteira entre itens com valores e itens com valores nulos e aparar o final em menos tempo. De fato, isso é verdade para todos os quebrados. Pelo menos em teoria, o system.arraycopy real não é realmente uma operação N na prática. Em teoria, teoria e prática são a mesma coisa; na prática eles não são.
fonte
Existe uma maneira fácil de remover todos os
null
valores decollection
.Você precisa passar uma coleção contendo null como parâmetro para oremoveAll()
métodofonte
A
Objects
classe tem umnonNull
Predicate
que pode ser usado comfilter
.Por exemplo:
fonte
Usando o Java 8, você pode fazer isso usando
stream()
efilter()
ou
Para mais informações: Java 8 - Streams
fonte
É uma maneira fácil de remover valores nulos padrão do arraylist
caso contrário, o valor da string "null" remove da arraylist
fonte
Eu brinquei com isso e descobri que trimToSize () parece funcionar. Estou trabalhando na plataforma Android para que possa ser diferente.
fonte
trimToSize
não modifica o conteúdo de aArrayList
. Se isso é diferente no Android, provavelmente é um bug.Podemos usar o iterador para remover todos os valores nulos.
fonte
Usei a interface de fluxo juntamente com a operação de fluxo collect e um método auxiliar para gerar uma nova lista.
fonte
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
Principalmente estou usando isso:
Mas depois que aprendi o Java 8, mudei para isso:
fonte
Usando o Java 8, isso pode ser realizado de várias maneiras, usando fluxos, fluxos paralelos e
removeIf
método:O fluxo paralelo utilizará os processadores disponíveis e acelerará o processo para listas de tamanhos razoáveis. É sempre aconselhável fazer benchmark antes de usar fluxos.
fonte
Semelhante à resposta @Lithium, mas não gera um erro "A lista não pode conter o tipo nulo":
fonte
fonte