Si vous êtes prêt à utiliser une bibliothèque tierce, vous pouvez utiliser la Collectors2classe dans Eclipse Collections pour convertir le Listen un Bagfichier Stream. A Bagest une structure de données conçue pour le comptage .
Bag<String> counted =
list.stream().collect(Collectors2.countBy(each -> each));
Assert.assertEquals(1, counted.occurrencesOf("World"));
Assert.assertEquals(2, counted.occurrencesOf("Hello"));
System.out.println(counted.toStringOfItemToCount());
Production:
{World=1, Hello=2}
Dans ce cas particulier, vous pouvez simplement collectle Listdirectement dans un fichier Bag.
Bag<String> counted =
list.stream().collect(Collectors2.toBag());
Vous pouvez également créer le Bagsans utiliser de Streamen adaptant le Listavec les protocoles des collections Eclipse.
Bag<String> counted = Lists.adapt(list).countBy(each -> each);
ou dans ce cas particulier:
Bag<String> counted = Lists.adapt(list).toBag();
Vous pouvez également créer le sac directement.
Bag<String> counted = Bags.mutable.with("Hello", "Hello", "World");
A Bag<String>est comme a Map<String, Integer>en ce sens qu'il garde en interne la trace des clés et de leur décompte. Mais, si vous demandez une Mapclé qu'il ne contient pas, il reviendra null. Si vous demandez à un Bagune clé qu'il ne contient pas occurrencesOf, il renverra 0.
Remarque: je suis un committer pour les collections Eclipse.