[BAEL-6371_char_frequence] Find the Most Frequent Characters in a String (#13877)
This commit is contained in:
parent
e94486a78d
commit
b00b487b4c
|
@ -39,8 +39,8 @@
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>${maven-compiler-plugin.version}</version>
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>${java.version}</source>
|
<source>${maven.compiler.source}</source>
|
||||||
<target>${java.version}</target>
|
<target>${maven.compiler.target}</target>
|
||||||
<compilerArgument>-parameters</compilerArgument>
|
<compilerArgument>-parameters</compilerArgument>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
package com.baeldung.charfreq;
|
||||||
|
|
||||||
|
import static java.util.Map.Entry.comparingByValue;
|
||||||
|
import static java.util.stream.Collectors.counting;
|
||||||
|
import static java.util.stream.Collectors.groupingBy;
|
||||||
|
import static java.util.stream.Collectors.toSet;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class CharacterWithHighestFrequency {
|
||||||
|
public static Character byStream(String input) {
|
||||||
|
return input.chars()
|
||||||
|
.mapToObj(x -> (char) x)
|
||||||
|
.collect(groupingBy(x -> x, counting()))
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.max(comparingByValue())
|
||||||
|
.get()
|
||||||
|
.getKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<Character> byMap(String input) {
|
||||||
|
Map<Character, Integer> map = new HashMap<>();
|
||||||
|
for (char c : input.toCharArray()) {
|
||||||
|
map.compute(c, (character, count) -> count == null ? 1 : ++count);
|
||||||
|
}
|
||||||
|
int maxCount = map.values()
|
||||||
|
.stream()
|
||||||
|
.mapToInt(Integer::intValue)
|
||||||
|
.max()
|
||||||
|
.getAsInt();
|
||||||
|
|
||||||
|
return map.keySet()
|
||||||
|
.stream()
|
||||||
|
.filter(c -> map.get(c) == maxCount)
|
||||||
|
.collect(toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<Character> byBucket(String input) {
|
||||||
|
int[] buckets = new int[128];
|
||||||
|
|
||||||
|
int maxCount = 0;
|
||||||
|
for (char c : input.toCharArray()) {
|
||||||
|
buckets[c]++;
|
||||||
|
maxCount = Math.max(buckets[c], maxCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
int finalMaxCount = maxCount;
|
||||||
|
return IntStream.range(0, 128)
|
||||||
|
.filter(c -> buckets[c] == finalMaxCount)
|
||||||
|
.mapToObj(i -> (char) i)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.baeldung.charfreq;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
class CharacterWithHighestFrequencyUnitTest {
|
||||||
|
private static final String INPUT1 = "aaaaaaaaaa(10) bbbbbbb ccccc dddd eee ff";
|
||||||
|
private static final Set<Character> EXPECTED1 = Collections.singleton('a');
|
||||||
|
|
||||||
|
private static final String INPUT2 = "YYYYYYY(7) bbbbb -------(7) dddd eee kkkkkkk(7) ff";
|
||||||
|
private static final Set<Character> EXPECTED2 = ImmutableSet.of('Y', '-', 'k');
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenGettingSingleCharWithHighestFrequencyByStream_shouldSuccess() {
|
||||||
|
char result1 = CharacterWithHighestFrequency.byStream(INPUT1);
|
||||||
|
assertEquals('a', result1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenGettingCharWithHighestFrequencyByMap_shouldSuccess() {
|
||||||
|
Set<Character> result1 = CharacterWithHighestFrequency.byMap(INPUT1);
|
||||||
|
assertEquals(EXPECTED1, result1);
|
||||||
|
|
||||||
|
Set<Character> result2 = CharacterWithHighestFrequency.byMap(INPUT2);
|
||||||
|
assertEquals(EXPECTED2, result2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenGettingCharWithHighestFrequencyByBucket_shouldSuccess() {
|
||||||
|
Set<Character> result1 = CharacterWithHighestFrequency.byBucket(INPUT1);
|
||||||
|
assertEquals(EXPECTED1, result1);
|
||||||
|
|
||||||
|
Set<Character> result2 = CharacterWithHighestFrequency.byBucket(INPUT2);
|
||||||
|
assertEquals(EXPECTED2, result2);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue