Se non ti dispiace utilizzando una libreria di terze parti Eclipse Collections ha un tipo che possono Bag
tieni traccia dei conteggi dei personaggi. Ho fornito due esempi qui sotto che usano Borse. Purtroppo non è disponibile lo maxByOccurrences
disponibile oggi allo Bag
, ma lo stesso risultato può essere ottenuto utilizzando topOccurrences(1)
che è disponibile. Puoi anche usare forEachWithOccurrences
per trovare il massimo ma sarà un po 'più di codice.
Nell'esempio seguente viene utilizzato uno CharAdapter
, anch'esso incluso nelle raccolte Eclipse.
MutableBag<Character> characters =
CharAdapter.adapt("Scala is awesomestttttts")
.collect(Character::toLowerCase)
.toBag();
MutableList<ObjectIntPair<Character>> charIntPairs = characters.topOccurrences(2);
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('t'), 6), charIntPairs.get(0));
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('s'), 5), charIntPairs.get(1));
Il secondo esempio utilizza il metodo chars()
accessibile String
che restituisca un IntStream
. Ci si sente un po 'imbarazzante che qualcosa chiamato caratteri() non restituisce un CharStream, ma questo è perché CharStream
non è disponibile in JDK 8.
MutableBag<Character> characters =
"Scala is awesomestttttts"
.toLowerCase()
.chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toCollection(Bags.mutable::empty));
MutableList<ObjectIntPair<Character>> charIntPairs = characters.topOccurrences(2);
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('t'), 6), charIntPairs.get(0));
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('s'), 5), charIntPairs.get(1));
In entrambi gli esempi, ho convertito i caratteri in minuscolo prima, quindi non c'è sono 5 occorrenze di "s". Se si desidera che le lettere maiuscole e minuscole siano distinte, è sufficiente rilasciare il codice minuscolo in entrambi gli esempi.
Nota: Sono un committer per le raccolte Eclipse.
fonte
2016-02-21 21:41:51
'System.out.println (Collections.max (tst.chars() .boxed() .collect (Collectors.groupingBy (i -> (char) (int) i, Collectors.counting())). entrySet(), Map.Entry.comparingByValue())) ' – Holger
@Holger Quello non viene compilato in intellij 15 –
@Federico Peralta Schaffner: quando lo copio dal mio commento, non funziona neanche, perché in qualche modo, un [ 'U + 200C'] (http://www.fileformat.info/info/unicode/char/200c/index.htm) [' U + 200B'] (http://www.fileformat.info/info/ unicode/char/200B/index.htm) la sequenza si è inserita tra '(' e ')' di 'emptySet()', invisibile ma causa errori del compilatore. Dopo aver rimosso questi due caratteri illegali, si compila bene con Netbeans e javac. – Holger