Como posso detectar (retornando verdadeiro / falso) se um ArrayList contém mais de um elemento do mesmo em Java?
Muito obrigado, terry
Editar Esqueci de mencionar que não estou procurando comparar "Blocos" entre si, mas seus valores inteiros. Cada "bloco" tem um int e é isso que os torna diferentes. Eu encontro o int de um bloco específico chamando um método chamado "getNum" (por exemplo, table1 [0] [2] .getNum ();
Respostas:
Mais simples: despeje toda a coleção em um Set (usando o construtor Set (Collection) ou Set.addAll) e veja se o Set tem o mesmo tamanho de ArrayList.
Update: Se estou entendendo sua pergunta corretamente, você tem uma matriz 2d de Bloco, como em
Tabela de blocos [] [];
e você deseja detectar se alguma linha deles tem duplicatas?
Nesse caso, eu poderia fazer o seguinte, supondo que Block implemente "equals" e "hashCode" corretamente:
Não tenho 100% de certeza quanto à sintaxe, então pode ser mais seguro escrevê-la como
Set.add
retorna um booleano falso se o item que está sendo adicionado já estiver no conjunto, então você pode até mesmo causar um curto-circuito e empatar em qualquer adição que retornefalse
se tudo o que você deseja saber é se há alguma duplicata.fonte
Código aprimorado, usando o valor de retorno de em
Set#add
vez de comparar o tamanho da lista e do conjunto.fonte
Set<T> set = new HashSet<T>(list.size());
:? Dado um parâmetro List, acho que é mais eficiente se for comum a lista não conter duplicatas.HashSet
para o tamanho da lista resultará no redimensionamento ao percorrer toda a lista por causa do fator de carga subjacente da estrutura hash.Se você está procurando evitar duplicatas, então você deve apenas cortar o processo intermediário de detecção de duplicatas e usar um Conjunto .
fonte
Código aprimorado para retornar os elementos duplicados
fonte
Se seus elementos forem de alguma forma comparáveis (o fato de a ordem ter qualquer significado real é indiferente - ela só precisa ser consistente com sua definição de igualdade), a solução de remoção de duplicatas mais rápida irá classificar a lista (0 (n log ( n))) então fazer uma única passagem e procurar repetidas elementos (ou seja, elementos iguais que se sucedem) (isto é O (n)).
A complexidade geral será O (n log (n)), que é aproximadamente a mesma que você obteria com um Conjunto (n vezes longo (n)), mas com uma constante muito menor. Isso ocorre porque a constante na classificação / desduplicação resulta do custo de comparar elementos, enquanto o custo do conjunto provavelmente resultará de um cálculo de hash, mais uma (possivelmente várias) comparações de hash. Se você estiver usando uma implementação de Set baseada em hash, isto é, porque uma baseada em Árvore vai lhe dar um O (n log² (n)), que é ainda pior.
Pelo que entendi, no entanto, você não precisa remover duplicatas, mas apenas testar sua existência. Portanto, você deve codificar manualmente um algoritmo de mesclagem ou classificação de pilha em sua matriz, que simplesmente sai retornando verdadeiro (ou seja, "há um dup") se seu comparador retornar 0, e de outra forma completar a classificação e percorrer o teste de matriz classificada para repetições . Em uma mesclagem ou classificação de heap, de fato, quando a classificação for concluída, você terá comparado todos os pares duplicados, a menos que ambos os elementos já estivessem em suas posições finais (o que é improvável). Assim, um algoritmo de classificação ajustado deve produzir uma grande melhoria de desempenho (eu teria que provar isso, mas acho que o algoritmo ajustado deve estar no O (log (n)) em dados uniformemente aleatórios)
fonte
Eu precisava fazer uma operação semelhante para a
Stream
, mas não consegui encontrar um bom exemplo. Aqui está o que eu inventei.Isso tem a vantagem de causar um curto-circuito quando duplicatas são encontradas no início, em vez de ter que processar todo o fluxo e não é muito mais complicado do que apenas colocar tudo em a
Set
e verificar o tamanho. Portanto, este caso seria aproximadamente:fonte
Com o Java 8+, você pode usar a API Stream:
fonte
Simplificando: 1) certifique-se de que todos os itens são comparáveis 2) classifique o array 2) itere sobre o array e encontre duplicatas
fonte
Para saber as duplicatas em uma lista, use o seguinte código: Ele fornecerá o conjunto que contém as duplicatas.
fonte
a melhor maneira de lidar com esse problema é usar um HashSet :
Basta imprimir a lista de resultados e ver o resultado sem duplicatas :)
fonte
Se você deseja o conjunto de valores duplicados:
E provavelmente também pense em cortar valores ou usar letras minúsculas ... dependendo do seu caso.
fonte
Nota: isso terá um grande impacto no desempenho, pois os itens são removidos do início da lista. Para resolver isso, temos duas opções. 1) iterar na ordem inversa e remover elementos. 2) Use LinkedList em vez de ArrayList. Devido a perguntas tendenciosas feitas em entrevistas para remover duplicatas da Lista sem usar qualquer outra coleção, o exemplo acima é a resposta. Porém, no mundo real, se eu tiver que conseguir isso, colocarei elementos de List to Set, simples!
fonte
Um exemplo de uma classe concreta que foi substituída
equals()
:fonte
fonte
Essa resposta foi escrita em Kotlin, mas pode ser facilmente traduzida para Java.
Se o tamanho do seu arraylist estiver dentro de uma pequena faixa fixa, esta é uma ótima solução.
fonte
fonte