Eu tenho uma ArrayList
classe Collection de Java, da seguinte maneira:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Como você pode ver, o animals
ArrayList
consiste em 3 bat
elementos e um owl
elemento. Gostaria de saber se existe alguma API na estrutura Collection que retorne o número de bat
ocorrências ou se existe outra maneira de determinar o número de ocorrências.
Descobri que a coleção do Google Multiset
tem uma API que retorna o número total de ocorrências de um elemento. Mas isso é compatível apenas com o JDK 1.5. Atualmente, nosso produto está no JDK 1.6, então não posso usá-lo.
java
arraylist
collections
MILÍMETROS.
fonte
fonte
Respostas:
Tenho certeza de que o método de frequência estática em Coleções seria útil aqui:
É assim que eu faria de qualquer maneira. Tenho certeza de que este é o jdk 1.6.
fonte
No Java 8:
fonte
Collections.frequency()
? Parece menos legível.Isso mostra por que é importante " Consulte os objetos por suas interfaces ", conforme descrito no livro Java Efetivo .
Se você codifica para a implementação e usa ArrayList em, digamos, 50 lugares no seu código, quando você encontra uma boa implementação de "Lista" que conta os itens, precisará alterar todos esses 50 locais e provavelmente precisará quebre seu código (se ele for usado apenas por você, não há grande coisa, mas se for usado por outra pessoa, você também quebrará o código)
Ao programar para a interface, você pode deixar esses 50 locais inalterados e substituir a implementação de ArrayList para "CountItemsList" (por exemplo) ou alguma outra classe.
Abaixo está um exemplo muito básico de como isso pode ser escrito. Esta é apenas uma amostra, uma lista pronta para produção seria muito mais complicada.
Princípios OO aplicados aqui: herança, polimorfismo, abstração, encapsulamento.
fonte
Desculpe, não há uma chamada de método simples que possa fazer isso. Tudo o que você precisa fazer é criar um mapa e contar a frequência com ele.
fonte
Não há método nativo em Java para fazer isso por você. No entanto, você pode usar IterableUtils # countMatches () do Apache Commons-Collections para fazer isso por você.
fonte
Na verdade, a classe Collections possui um método estático chamado: frequency (Collection c, Object o) que retorna o número de ocorrências do elemento que você está procurando, a propósito, isso funcionará perfeitamente para você:
fonte
Solução alternativa para Java 8 usando Streams :
fonte
Gostaria de saber por que você não pode usar a API Collection do Google com o JDK 1.6. Diz isso? Eu acho que você pode, não deve haver problemas de compatibilidade, pois ele foi desenvolvido para uma versão inferior. O caso teria sido diferente se isso fosse construído para a 1.6 e você estivesse executando a 1.5.
Estou errado em algum lugar?
fonte
Uma abordagem um pouco mais eficiente pode ser
fonte
Para obter diretamente as ocorrências do objeto da lista:
Para obter a ocorrência da coleção Object dentro da lista, substitua o método equals na classe Object como:
Chame o Collections.frequency como:
fonte
Maneira simples de encontrar a ocorrência do valor da sequência em uma matriz usando os recursos do Java 8.
Saída: {Gato = 2, Cabra = 1, Vaca = 1, Vaca = 1, Cão = 1}
Você pode notar que "vaca" e vaca não são consideradas a mesma sequência de caracteres, caso seja necessário na mesma contagem, use .toLowerCase (). Encontre o trecho abaixo para o mesmo.
Saída: {gato = 2, vaca = 2, cabra = 1, cachorro = 1}
fonte
toString()
é necessária. Você pode fazer:duplicateList.stream().collect(Collectors.groupingBy(e -> e,Collectors.counting()));
O que você quer é uma bolsa - que é como um conjunto, mas também conta o número de ocorrências. Infelizmente, o framework java Collections - por mais que eles não tenham um implemento Bag. Para isso, é necessário usar o texto do link Apache Common Collection
fonte
Método 1:
Método 2:
fonte
Se você usar o Eclipse Collections , poderá usar a
Bag
. AMutableBag
pode ser retornado de qualquer implementação deRichIterable
, chamandotoBag()
.A
HashBag
implementação no Eclipse Collections é apoiada por aMutableObjectIntMap
.Nota: Sou um colaborador das Coleções Eclipse.
fonte
Coloque os elementos da lista de matrizes no hashMap para contar a frequência.
fonte
Java 8 - outro método
fonte
Faça da maneira antiquada e faça o seu próprio:
fonte
Se você é usuário do meu DSL ForEach , isso pode ser feito com uma
Count
consulta.fonte
Eu não queria tornar esse caso mais difícil e o tornei com dois iteradores. Eu tenho um HashMap com Sobrenome -> Nome. E meu método deve excluir itens com dulicate FirstName.
fonte
Resultado:
fonte
fonte
fonte