Eu tenho um ArrayList<String>
e quero remover seqüências repetidas dele. Como posso fazer isso?
java
list
collections
arraylist
duplicates
user25778
fonte
fonte
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
eSet
(em vez dos tipos de implementaçãoArrayList
eHashSet
como no seu exemplo).new HashSet(al)
vez de inicializá-lo para esvaziar e chamaraddAll
.Object
tiver vários valores, se dois deles repetirem, considero-os duplicados (outros valores podem ser diferentes) e utilizoSet
?Embora a conversão de
ArrayList
paraHashSet
remove efetivamente duplicatas, se você precisar preservar o pedido de inserção, sugiro que você use essa varianteEntão, se você precisar recuperar uma
List
referência, poderá usar novamente o construtor de conversões.fonte
No Java 8:
Observe que o contrato hashCode-igual para os membros da lista deve ser respeitado para que a filtragem funcione corretamente.
fonte
addAll
paranew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. O primeiro elemento adicionado permanecerá no conjunto, portanto, se sua lista contiver "Cão" e "cachorro" (nessa ordem),TreeSet
ela conterá "Cão". Se a ordem deve ser preservada, antes da linha na respostalist.replaceAll(String::toUpperCase);
.Suponha que tenhamos uma lista
String
como:Em seguida, podemos remover elementos duplicados de várias maneiras.
Antes do Java 8
Nota: Se queremos manter o pedido de inserção, precisamos usar
LinkedHashSet
no lugar deHashSet
Usando goiaba
Usando Java 8
Nota: Caso desejemos coletar o resultado em uma implementação de lista específica, por exemplo
LinkedList
, podemos modificar o exemplo acima como:Também podemos usar
parallelStream
o código acima, mas ele pode não fornecer os benefícios esperados de desempenho. Verifique esta pergunta para mais.fonte
parallel streams
sempre apresentaria melhor desempenho. Mas é um mito. Mais tarde eu aprendi que existem certos cenários em que fluxos paralelos devem ser usados. Nesse cenário, os fluxos paralelos não oferecem melhor desempenho. e sim fluxos paralelos podem não fornecer os resultados desejados em alguns casos.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
deve ser a solução adequada neste casoSe você não deseja duplicatas, use um conjunto em vez de um
List
. Para converter umList
em um,Set
você pode usar o seguinte código:Se realmente necessário, você pode usar a mesma construção para converter uma
Set
volta em aList
.fonte
Set
não pode ser usado aqui.Você também pode fazer dessa maneira e preservar a ordem:
fonte
Os fluxos do Java 8 fornecem uma maneira muito simples de remover elementos duplicados de uma lista. Usando o método distinto. Se temos uma lista de cidades e queremos remover duplicatas dessa lista, isso pode ser feito em uma única linha -
Como remover elementos duplicados de uma matriz
fonte
Aqui está uma maneira de não afetar o pedido da sua lista:
l1 é a lista original e l2 é a lista sem itens repetidos (verifique se YourClass tem o método equals de acordo com o que você deseja que seja a igualdade)
fonte
ArrayList<T>
devem ser usados em vez deArrayList
) 2) A criação explícita do iterador pode ser evitada usando afor (T current : l1) { ... }
. Mesmo se você quiser usar umIterator
explicitamente,iterador
está incorreto.É possível remover duplicatas do arraylist sem usar o HashSet ou mais um arraylist .
Experimente este código ..
Saída é
fonte
ImmutableSet.copyOf(lst).toList()
.indexOf
itera olst
uso de um loop for.Também existe
ImmutableSet
do Guava como uma opção ( aqui está a documentação):fonte
ImmutableSet.asList()
método, retornando umImmutableList
, se você precisar de volta como aList
.isso pode resolver o problema:
fonte
Provavelmente um pouco exagerado, mas eu gosto desse tipo de problema isolado. :)
Esse código usa um conjunto temporário (para a verificação de exclusividade), mas remove os elementos diretamente dentro da lista original. Como a remoção de elementos dentro de um ArrayList pode induzir uma grande quantidade de cópias de array, o método remove (int) é evitado.
Enquanto estamos nisso, aqui está uma versão para o LinkedList (muito melhor!):
Use a interface do marcador para apresentar uma solução unificada para a Lista:
Edição: Eu acho que o material genérico realmente não agrega valor aqui .. Oh, bem. :)
fonte
fonte
Se você estiver disposto a usar uma biblioteca de terceiros, poderá usar o método
distinct()
no Eclipse Collections (anteriormente GS Collections).A vantagem de usar em
distinct()
vez de converter para um conjunto e depois voltar para uma lista é quedistinct()
preserva a ordem da lista original, mantendo a primeira ocorrência de cada elemento. É implementado usando um conjunto e uma lista.Se você não conseguir converter sua Lista original em um tipo de Coleções Eclipse, poderá usar o ListAdapter para obter a mesma API.
Nota: Sou um colaborador das Coleções Eclipse.
fonte
Essas três linhas de código podem remover o elemento duplicado de ArrayList ou qualquer coleção.
fonte
Ao preencher o ArrayList, use uma condição para cada elemento. Por exemplo:
Obteremos uma matriz {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fonte
Se você deseja preservar seu pedido, é melhor usar o LinkedHashSet . Como se você deseja passar essa lista para uma consulta de inserção, iterando-a, o pedido será preservado.
Tente isto
Essa conversão será muito útil quando você desejar retornar uma Lista, mas não um Conjunto.
fonte
Código:
Nota: Definitivamente, haverá sobrecarga de memória.
fonte
fonte
LinkedHashSet fará o truque.
// saída: 5,1,2,3,4
fonte
fonte
Isso é usado para sua lista de objetos personalizados
fonte
você pode usar o loop aninhado a seguir:
fonte
Como dito anteriormente, você deve usar uma classe implementando a interface Set em vez de List para garantir a unicidade dos elementos. Se você precisar manter a ordem dos elementos, a interface SortedSet poderá ser usada; a classe TreeSet implementa essa interface.
fonte
Se você estiver usando o tipo de modelo List <T> / ArrayList <T>. Espero que seja de ajuda.
Aqui está o meu código sem usar nenhuma outra estrutura de dados como set ou hashmap
fonte
fonte
fonte
fonte
fonte
Se você deseja remover duplicatas do ArrayList significa encontrar a lógica abaixo,
fonte